mm_os
Version:
这是超级美眉服务端框架,用于快速构建应用程序。
366 lines (353 loc) • 8.88 kB
JavaScript
const Item = require('mm_machine').Item;
const Check = require('mm_check');
/**
* Param参数驱动类
* @extends {Item}
* @class
*/
class Drive extends Item {
/**
* @param {String} dir 当前目录
*/
constructor(dir) {
super(dir, __dirname);
this.default_file = "./param.json";
// 默认启用热更新
this.mode = 3;
/* 通用项 */
// 配置参数
this.config = {
// 名称, 由中英文和下“_”组成, 用于修改或卸载 例如: demo
"name": "",
// 状态 0未启用,1启用
"state": 1,
// 参数过滤
"filter": true,
// 默认监听方法, 当查询参数中出现监听的关键词时,选择以该键值作为请求方式,否则默认为get
"method": "method",
// 增
"add": {
// body参数
"body": [],
// body中的必填参数
"body_required": []
},
// 删
"del": {
// url中的query参数
"query": [],
// query中的必填参数
"query_required": []
},
// 改
"set": {
// url中的query参数
"query": [],
// query中的必填参数
"query_required": [],
// body参数
"body": [],
// body中的必填参数
"body_required": [],
// 不包含参数
"body_not": []
},
// 查
"get": {
// url中的query参数
"query": [],
// query中的必填参数
"query_required": []
},
// 导入
"import": {
// body中的参数
"body": ["name"],
// body中的必填参数
"body_required": ["file"]
},
// 导出
"export": {
// url中的query参数
"query": [],
// query中的必填参数
"query_required": []
},
// 去重
"del_req": {
// query中的必填参数
"query_required": ["groupby", "sort"]
},
// 合计
"sum": {
// query中的必填参数
"query_required": ["field", "groupby"]
},
// 总数
"count": {
// query中的必填参数
"query_required": ["field", "groupby"]
},
// 提交
// "post": {
// // url中的query参数
// "query": [],
// // query中的必填参数
// "query_required": [],
// // body参数
// "body": [],
// // body中的必填参数
// "body_required": [],
// // 不包含参数
// "body_not": []
// },
// 验证参数集
"list": [],
// 文件路径, 当调用函数不存在时,会先从文件中加载
"func_file": "",
// 回调函数名 用于决定调用脚本的哪个函数
"func_name": ""
};
}
}
/**
* 更新验证对象
*/
Drive.prototype.updateCheck = function() {
var lt = this.config.list;
var len = lt.length;
for (var i = 0; i < len; i++) {
var o = lt[i];
if (!o.check) {
lt[i] = new Check(o);
}
}
};
/**
* 设置配置
* @param {Object} config 配置
*/
Drive.prototype.set_config_after = function() {
this.updateCheck();
}
/// 新建配置参数模型, 用于动态创建配置时
Drive.prototype.model = function() {
return new Check({
// 参数名
"name": "name",
// 参数介绍名
"title": "名称",
// 参数做用描述
"description": "用户名称,传入字符串",
// 是否唯一值, 需配合数据库验证
"only": false,
// 分隔符号, 用于查询时判断多个传参
"splitter": "|",
// 是否主键
"key": false,
// 参数类型 string字符串、number数字、bool布尔、dateTime时间、object对象类型、array数组类型
"type": "string",
// 数据存储类型 tinyint布尔型(0,1),smallint短整数型,mediumint中整数型,int长整数型,float浮点数型,double双精度型,timestamp时间戳型,date日期型,time时间型,varchar字符串型,text长文本型
"dataType": "",
// 字符串相关验证
"string": {
// 非空
"notEmpty": false,
// 最小长度
"min": 0,
// 最大长度
"max": 0,
// 验证字符串范围, 传入两个成员, 最小长度和最大长度。例如:[0, 0]
"range": [],
// 验证正则表达式
"regex": "",
// 验证与某个参数值是否相同
"identical": "",
// 验证与某个参数值是否不同
"different": "",
// 后缀名, 多个后缀名用“|”分隔
"extension": "",
// 格式验证 email、url、date、dateISO、number、digits、phone
"format": ""
},
// 数值相关验证
"number": {
// 最小值
"min": 0,
// 最大值
"max": 0,
// 验证字符串范围
"range": []
},
"default": ""
});
};
/**
* 验证值是否符合
* @param {Object} model 验证模型
* @param {Object} value 被验证的值
* @param {String} method 请求方式, post提交、get增、del删、set改、get查、import导入、export导出
* @return {Object} 没通过返回信息,否则返回空
*/
Drive.prototype.check_item = function(model, value, method) {
var msg;
if (value === "" || value === undefined || value === null) {
if (method.has(model.name)) {
msg = model.msg_head(model) + model.msg('required');
}
} else {
msg = model.run(value);
if (!msg) {
msg = this.main(model, value);
}
if (msg) {
return msg;
}
}
return msg;
};
/**
* 获取模型
* @param {String} name 名称
* @return {Object} 配置模型
*/
Drive.prototype.getModel = function(name) {
var model;
var lt = this.config.list;
for (var i = 0, o; o = lt[i++];) {
if (o['name'] === name) {
model = o;
break;
}
}
return model;
};
/**
* 执行验证
* @param {Object} params 请求参数集合
* @param {Array} arr 要验证的参数名数组
* @param {Array} required 必填项名称数组
* @return {String} 返回验证结果
*/
Drive.prototype.check_sub = function(params, arr, required) {
var msg;
for (var i = 0; i < arr.length; i++) {
var k = arr[i];
var o = this.getModel(k);
if (o) {
var value = params[k];
msg = this.check_item(o, value, required);
var s = o.string;
if (!msg && value && s) {
if (s.identical) {
var val = params[s.identical];
if (val !== value) {
var m = this.getModel(s.identical);
if (m) {
msg = o.msg('identical', o.title + '(' + o.name + ')', m.title + '(' + m.name +
')');
} else {
msg = o.msg('identical', o.title + '(' + o.name + ')', s.identical);
}
}
} else if (s.different) {
var val = params[s.different];
if (val === value) {
var m = this.getModel(s.different);
if (m) {
msg = o.msg('different', o.title + '(' + o.name + ')', m.title + '(' + m.name +
')');
} else {
msg = o.msg('different', o.title + '(' + o.name + ')', s.different);
}
}
}
}
if (msg) {
break;
}
}
}
return msg;
};
/**
* 验证参数是否符合
* @param {Object} query url参数集合
* @param {Object} body 正文参数集合
* @param {String} method 请求方式,get增、del删、set改、get查、import导入、export导出
* @return {Object} 没通过返回信息,否则返回空
*/
Drive.prototype.check = function(query, body, method) {
if (method !== 'GET') {
method = method.toLowerCase();
}
var m = this.config[method];
if (!m) {
var m_key = this.config.method;
if (m_key) {
var md = query[m_key];
if (md) {
m = this.config[md];
}
}
if (!m) {
m = this.config["get"];
}
}
var arr = m["query"];
if (!arr || arr.length === 0) {
arr = [];
for (var k in query) {
if (arr.indexOf(k) === -1) {
arr.push(k);
}
}
}
var arr_query = m['query_required'] ? m['query_required'] : [];
arr.addList(arr_query);
var msg = this.check_sub(query, arr, arr_query);
if (!msg) {
var ar = m['body_not'];
if (ar && body && ar.length > 0) {
for (var i = 0; i < ar.length; i++) {
var k = ar[i];
delete body[k];
}
}
arr = m["body"];
if (!arr || arr.length === 0) {
arr = [];
for (var k in query) {
if (arr.indexOf(k) === -1) {
arr.push(k);
}
}
}
var arr_body = m['body_required'] ? m['body_required'] : [];
arr.addList(arr_body);
msg = this.check_sub(body, arr, arr_body);
}
return msg;
};
/**
* 取字段
* @param {Object} model 验证模型
* @return {String} 返回名称
*/
Drive.prototype.title = function(model) {
if (!model.title) {
return model.name + " ";
} else {
return model.title + "(" + model.name + ") ";
}
};
/**
* 验证回调函数
* @param {Object} model 当前的验证模型
* @param {Object} value 当前的验证值
* @return {Object} 没通过返回信息,否则返回空
*/
Drive.prototype.main = function(model, value) {
return null;
};
module.exports = Drive;