codekart
Version:
Web application framework for Node.js
316 lines (259 loc) • 8.18 kB
JavaScript
/**
* 全局函数
*/
var fs = require('fs');
var path = require('path');
var c_path = require('./config/path');
var file = require('./tool/file');
var array = require('./tool/array');
var object = require('./tool/object');
//成功加载过的模块名缓存
var model_name_cache = {};
/**
* 处理文件名后缀
* @param ext 文件名后缀
*/
function suffix(ext){
ext = ext || 'js';
ext = '.'+ext;
return ext;
}
/**
* 返回加载模块解析后的文件名
* @param name 文件名或路径
*/
function proload(base,name,ext,opt){
var bname = base+'/'+name;
//console.log(bname);
//检查缓存,加载过路径则马上返回
var cache = model_name_cache[bname];//array.matchItem(model_name_cache,'name',bname);
if(cache) return require(cache);
//没有缓存加载新库
var p0 = ''
, p1 = c_path.app+'/'+base+'/'
, p2 = c_path.framework+'/'+base+'/';
//如果模块第一个字符为!感叹号,则默认先加载框架模块,否则加载用户模块
var isi = ('!'==name.charAt(0));
name = ''+name;
if(isi){
p0 = false; //不进行
var p = p1;
p1 = p2;
p2 = p; //交换顺序
name = name.substr(1); //去除!符号
}
p1 += name;
p2 += name;
//后缀
ext = suffix(ext);
var path_ary = [
p1+ext,
p1+'/index'+ext,
p1+'/'+name+ext,
p2+ext,
p2+'/index'+ext,
p2+'/'+name+ext
];
//自定义配置文件路径
var c_p = ENVIRONMENT;
if(!isi&&base=='config'&&c_p){
p0 = c_path.app+'/config/'+c_p;
//path_ary.unshift(p0+ext);
//path_ary.unshift(p0+'/index'+ext);
path_ary.unshift(p0+'/'+name+ext);
}
//if(p0) console.log(path_ary);
//查找可用路径
var pathone = file.validPath(path_ary);
//console.log(pathone);
if(pathone){
model_name_cache[bname] = pathone;
return require(pathone);
}else{
if(opt&&opt.noerror){ //返回错误,而不是中断执行
return null;
}else{
return require(path_ary[1]); //不存在模块,将报错,用于错误提示
}
}
}
/**
* 全局模块
* @type load
*/
global.load = {
/* 加载核心模块 */
core: function(name,ext){
return proload('core',name,ext);
},
/* 加载数据库模块 */
db: function(name,ext){
return proload('core/db',name,ext);
},
/* 加载库 */
lib: function(name,ext){
return proload('lib',name,ext);
},
/* 加载工具 */
tool: function(name,ext){
return proload('tool',name,ext);
},
/* 加载页面处理程序 */
view: function(name,ext){
return proload('view',name,ext,{noerror:true});
},
/* 加载配置文件 */
config: function(name,ext){
if(!name) name = 'config'; //默认文件
return proload('config',name,ext);
},
/* 加载程序模块 */
model: function(name,ext){
ext = suffix(ext);
return require(c_path.model+'/'+ name+ext);
},
/* 加载app下处理程序 */
app: function(name,ext){
ext = suffix(ext);
return require(c_path.app+'/'+name+ext);
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 同步或异步加载资源
*/
function proread(dir,filename,opt,callback){
var resource = dir?'/'+dir+'/':'/'
, p1 = c_path.app+resource
, p2 = c_path.framework+resource;
//如果模块第一个字符为!感叹号,则默认先加载框架资源,否则先加载用户资源
if('!'===filename.charAt(0)){
var p = p1;
p1 = p2;
p2 = p; //交换顺序
filename = filename.substr(1); //去除!符号
}
// 读取配置文件则加上环境变量
var vpath = []
, env = ENVIRONMENT ? ENVIRONMENT+'/' : '';
if(dir=='config' && env){
vpath.push(p1+filename);
vpath.push(p1+env+filename);
vpath.push(p2+filename);
vpath.push(p2+env+filename);
}else{
vpath.push(p1+filename);
vpath.push(p2+filename);
}
if(callback&&typeof callback=='function'){ //异步读取加载
file.validPath(vpath,function(pathone){
if(!pathone){
var err = 'File does not exist: '+vpath[0];
callback(err,null);
}else{
fs.readFile(pathone, 'utf8',function(err, data){
callback(err,data);
});
}
});
}else{ //同步加载读取
var pathone = file.validPath(vpath);
if(!pathone){
var err = 'File does not exist: '+vpath[0];
return null; //不存在文件
}
return fs.readFileSync(pathone);
}
return true;
}
/**
* 读取资源
*/
global.read = {
ex: proread, //终极
resource: function(filename,opt,callback){
return proread('resource',filename,opt,callback);
},
config: function(filename,opt,callback){
return proread('config',filename,opt,callback);
},
app: function(filename,opt,callback){
return proread('',filename,opt,callback);
}
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 打印日志
*/
//var logconf = load.config('log'); //日志配置
var logob = load.core('log'); //日志模块
global.log = function(content,opt){
if(!opt){ // 没有配置,原生输出
return console.log(content);
}
//日志模块输出
logob.out(content,opt);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 继承页面
*/
global.inheritView = function(parent,stuff){
var child = object.clone(load.view(parent).stuff); //拷贝父级页面配置
for(var c in child){
var cn = child[c];
if(stuff[c]){ // 增加stuff数据
if(array.isArray(stuff[c])){
child[c] = child[c].concat(stuff[c]);
}else{
child[c].push(stuff[c]);
}
}
}
child.inherit.push(parent); //祖先页面名称链
return child;
};
/**
* 获取当前时间戳 秒数/毫秒
*/
global.time = function(ms){
var d = new Date().getTime();
if(ms) return d;
else return parseInt(d/1000);
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* 时间格式化
*/
Date.prototype.format = function(format){
//使用方法
//var now = new Date();
//var nowStr = now.format("yyyy-MM-dd hh:mm:ss");
//使用方法2:
//var testDate = new Date();
//var testStr = testDate.format("YYYY年MM月dd日hh小时mm分ss秒");
//alert(testStr);
//示例:
//alert(new Date().Format("yyyy年MM月dd日"));
//alert(new Date().Format("MM/dd/yyyy"));
//alert(new Date().Format("yyyyMMdd"));
//alert(new Date().Format("yyyy-MM-dd hh:mm:ss"));
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
};
if(/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length));
}
}
return format;
};