mirror of
https://github.com/thinkjs/thinkjs.git
synced 2026-01-18 14:26:56 +00:00
333 lines
8.4 KiB
JavaScript
333 lines
8.4 KiB
JavaScript
var fs = require("fs");
|
||
var path = require("path");
|
||
var os = require("os");
|
||
//EventEmitter
|
||
var EventEmitterInstance = new (require('events').EventEmitter)();
|
||
|
||
|
||
var _alias = {};
|
||
var _autoload_callbacks = [];
|
||
/**
|
||
* think_require获取到的路径
|
||
* @param {[type]} name [description]
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.think_require_path = function(name){
|
||
if (_alias[name]) {
|
||
return _alias[name];
|
||
};
|
||
var result = '';
|
||
_autoload_callbacks.some(function(callback){
|
||
result = callback && callback(name);
|
||
if (result) {
|
||
return true;
|
||
};
|
||
});
|
||
return result;
|
||
}
|
||
/**
|
||
* 自定义的require, 加入别名功能
|
||
* @type {[type]}
|
||
*/
|
||
global.think_require = function(name){
|
||
var path = think_require_path(name);
|
||
if (path) {
|
||
var obj = require(path);
|
||
if (typeof obj === 'function') {
|
||
//修正子类继承的方法获取到正确的文件名
|
||
obj.prototype.__filename = path;
|
||
};
|
||
return obj;
|
||
};
|
||
return require(name);
|
||
}
|
||
/**
|
||
* 注册require
|
||
* @param {Function} callback [description]
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.register_autoload = function(callback){
|
||
_autoload_callbacks.push(callback);
|
||
}
|
||
/**
|
||
* 别名
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.alias_import = function(alias, classFile){
|
||
if (is_string(alias)) {
|
||
return (_alias[alias] = classFile);
|
||
};
|
||
_alias = extend(_alias, alias);
|
||
}
|
||
/**
|
||
* 类继承
|
||
* @param {[type]} className [description]
|
||
* @param {[type]} obj [description]
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.inherits = function(className, obj){
|
||
var cls = Class({});
|
||
cls.inherits(think_require(className));
|
||
cls.extend(obj);
|
||
return cls;
|
||
};
|
||
|
||
["Cache", "Behavior", "Controller", "Session", "Model", "Db"].forEach(function(item){
|
||
global[item] = function(super_, obj){
|
||
if (is_string(super_)) {
|
||
return inherits(super_, obj);
|
||
}
|
||
return inherits(item, super_);
|
||
}
|
||
});
|
||
|
||
|
||
/**
|
||
* 调用一个指定的行为
|
||
* @param {[type]} name [description]
|
||
*/
|
||
global.B = function(name, http, data){
|
||
var cls = name + "Behavior";
|
||
if (APP_DEBUG) {
|
||
G('behavior_start');
|
||
};
|
||
var result = think_require(cls)(http).run(data);
|
||
if (APP_DEBUG) {
|
||
G('behavior_end');
|
||
};
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 处理标签扩展
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.tag = function(name, http, data){
|
||
var sys_tags = C('sys_tag.' + name) || [];
|
||
var tags = C('tag.' + name) || [];
|
||
//tag处理的数据
|
||
http.tag_data = data;
|
||
if (tags.length) {
|
||
var override = false;
|
||
if (typeof tags[0] == 'boolean') {
|
||
override = tags[0];
|
||
tags.shift();
|
||
};
|
||
if (!override && sys_tags.length) {
|
||
tags = sys_tags.concat(tags);
|
||
};
|
||
}else{
|
||
tags = sys_tags;
|
||
}
|
||
if (tags.length) {
|
||
if (APP_DEBUG) {
|
||
G(name + '_start');
|
||
};
|
||
tags = tags.slice();
|
||
function runBehavior(){
|
||
var behavior = tags.shift();
|
||
if (behavior) {
|
||
var result = B(behavior, http, http.tag_data);
|
||
if (is_promise(result)) {
|
||
return result.then(function(data){
|
||
if (data !== undefined) {
|
||
http.tag_data = data;
|
||
};
|
||
return runBehavior();
|
||
})
|
||
}else{
|
||
if (result !== undefined) {
|
||
http.tag_data = result;
|
||
};
|
||
return runBehavior();
|
||
}
|
||
}
|
||
return http.tag_data;
|
||
}
|
||
return get_promise(runBehavior());
|
||
};
|
||
return get_promise(http.tag_data);
|
||
}
|
||
/**
|
||
* 配置读取和写入
|
||
*/
|
||
var _config = {};
|
||
global.C = function(name, value){
|
||
if (name === undefined) {
|
||
return _config;
|
||
};
|
||
if (is_string(name)) {
|
||
if (name.indexOf('.') <= 0) {
|
||
name = name.toLowerCase();
|
||
if (value === undefined) {
|
||
return _config[name];
|
||
};
|
||
_config[name] = value;
|
||
return;
|
||
};
|
||
name = name.split(".");
|
||
name[0] = name[0].toLowerCase();
|
||
if (value === undefined) {
|
||
value = _config[name[0]] || {};
|
||
return value[name[1]];
|
||
};
|
||
if (!_config[name[0]]) {
|
||
_config[name[0]] = {};
|
||
};
|
||
_config[name[0]][name[1]] = value;
|
||
}else{
|
||
_config = extend(_config, name);
|
||
}
|
||
}
|
||
/**
|
||
* 记录时间和内存使用情况
|
||
*/
|
||
global.G = function(){
|
||
return {
|
||
time: Date.now(),
|
||
memory: os.totalmem() - os.freemem()
|
||
}
|
||
}
|
||
/**
|
||
* 实例化Controller类,可以调用一个具体的Action
|
||
* A('Home/Index'), A('Admin/Index/test')
|
||
* @param {[type]} name [description]
|
||
*/
|
||
global.A = function(name, http, data){
|
||
if (name.indexOf('/') === -1) {
|
||
name = http.req.group + "/" + name;
|
||
};
|
||
name = name.split("/");
|
||
var gm = name.shift() + "/" + name.shift();
|
||
var action = name.shift();
|
||
var path = think_require_path(gm + "Controller");
|
||
if (path) {
|
||
var instance = think_require(gm + "Controller")(http);
|
||
if (action) {
|
||
action += C('action_suffix');
|
||
return instance[action].apply(instance, data || []);
|
||
};
|
||
return instance;
|
||
};
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* 快速文件读取和写入
|
||
* 默认写入到App/Runtime/Data目录下
|
||
*/
|
||
var _cache = {};
|
||
global.F = function(name, value, rootPath){
|
||
if (rootPath === undefined) {
|
||
rootPath = DATA_PATH;
|
||
};
|
||
var filename = rootPath + "/" + name + ".json";
|
||
if (value !== undefined) {
|
||
if (value === null) {
|
||
if (is_file(filename)) {
|
||
fs.unlink(filename, function(){});
|
||
};
|
||
return;
|
||
};
|
||
var dir = path.dirname(filename);
|
||
mkdir(dir, "0777");
|
||
_cache[name] = value;
|
||
fs.writeFile(filename, JSON.stringify(value), function(){});
|
||
return;
|
||
};
|
||
if (_cache[name] !== undefined) {
|
||
return _cache[name];
|
||
};
|
||
if (is_file(filename)) {
|
||
var data = JSON.parse(file_get_contents(filename));
|
||
_cache[name] = data;
|
||
return data;
|
||
};
|
||
return false;
|
||
}
|
||
/**
|
||
* 实例化模型
|
||
*/
|
||
global.M = global.D = function(name, tablePrefix, connection){
|
||
if (name === undefined) {
|
||
return think_require("Model")();
|
||
};
|
||
name = name.split(":");
|
||
var path = think_require_path(name[0] + "Model");
|
||
if (path) {
|
||
return think_require(name[0] + "Model")(name[1], tablePrefix, connection);
|
||
}else{
|
||
return think_require("Model")(name[0], tablePrefix, connection);
|
||
}
|
||
}
|
||
/**
|
||
* 缓存的设置和读取
|
||
* 获取返回的是一个promise
|
||
*/
|
||
global.S = function(name, value, options){
|
||
if (options === undefined) {
|
||
options = {};
|
||
}else if (options === true) {
|
||
options = {type: true};
|
||
};
|
||
var type = options.type || C('data_cache_type');
|
||
if (type && type !== true) {
|
||
type = ucfirst(type.toLowerCase()) + "Cache";
|
||
}else{
|
||
type = "Cache";
|
||
}
|
||
var instance = think_require(type)(options);
|
||
//获取缓存
|
||
if (value === undefined) {
|
||
return instance.get(name);
|
||
};
|
||
//移除缓存
|
||
if (value === null) {
|
||
return instance.rm(name);
|
||
};
|
||
var expire = is_number(options) ? options : undefined;
|
||
return instance.set(name, value, expire);
|
||
}
|
||
/**
|
||
* 自定义事件
|
||
* @param {[type]} name [description]
|
||
* @param {Function} callback [description]
|
||
*/
|
||
global.E = function(event, callback, remove){
|
||
var instance = EventEmitterInstance;
|
||
if (remove === true) {
|
||
return instance.removeListener(event, callback);
|
||
};
|
||
if (typeof callback == 'function') {
|
||
return instance.on(event, callback);
|
||
};
|
||
if (callback === null) {
|
||
return instance.removeAllListeners(event);
|
||
};
|
||
if (callback === true) {
|
||
return instance.listeners(event);
|
||
};
|
||
var args = [].slice.call(arguments, 1);
|
||
args.unshift(event);
|
||
return instance.emit.apply(instance, args);
|
||
}
|
||
|
||
/**
|
||
* 计数
|
||
*/
|
||
global.N = function(){
|
||
|
||
}
|
||
global.L = function(name){
|
||
return name;
|
||
}
|
||
/**
|
||
* 发送状态
|
||
* @param {[type]} res [description]
|
||
* @param {[type]} statusCode [description]
|
||
* @return {[type]} [description]
|
||
*/
|
||
global.send_status = function(res, statusCode){
|
||
res.statusCode = statusCode || 403;
|
||
res.end();
|
||
} |