mm_os 2.3.8 → 2.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/com/api/drive.js +9 -9
- package/demo/app/test/event_api/client/main.js +5 -6
- package/demo/app/test/plugin/api_demo_client/test/api.json +41 -0
- package/demo/app/test/plugin/api_demo_client/test/index.js +35 -0
- package/demo/app/test/plugin/api_demo_client/test/param.json +130 -0
- package/demo/app/test/plugin/api_demo_client/test/sql.json +70 -0
- package/demo/config/development.json +1 -1
- package/package.json +2 -2
package/core/com/api/drive.js
CHANGED
|
@@ -361,7 +361,7 @@ $.get_state = async function(db, token) {
|
|
|
361
361
|
var db1 = db.new("user_state", "user_id");
|
|
362
362
|
var state = await db1.getObj({
|
|
363
363
|
token
|
|
364
|
-
});
|
|
364
|
+
}, null, null, false);
|
|
365
365
|
if (!state) {
|
|
366
366
|
return null
|
|
367
367
|
}
|
|
@@ -371,8 +371,7 @@ $.get_state = async function(db, token) {
|
|
|
371
371
|
var user = await db.getObj({
|
|
372
372
|
user_id: state.user_id
|
|
373
373
|
});
|
|
374
|
-
|
|
375
|
-
o = Object.assign({}, user);
|
|
374
|
+
var o = Object.assign({}, user);
|
|
376
375
|
o.password_pay = o.password_pay ? "******" : "";
|
|
377
376
|
o.password = o.password ? "******" : "";
|
|
378
377
|
delete o.salt;
|
|
@@ -404,21 +403,22 @@ Drive.prototype.get_state = async function(ctx, db) {
|
|
|
404
403
|
if (token) {
|
|
405
404
|
u = await $.cache.get($.dict.session_id + '_' + token);
|
|
406
405
|
if (u) {
|
|
407
|
-
|
|
408
|
-
if (type === "string") {
|
|
406
|
+
if (typeof(u) === "string") {
|
|
409
407
|
o = Object.assign({}, u.toJson());
|
|
410
|
-
} else {
|
|
411
|
-
|
|
412
|
-
o = Object.assign({}, u);
|
|
413
|
-
}
|
|
408
|
+
} else if (Object.keys(u).length > 0) {
|
|
409
|
+
o = Object.assign({}, u);
|
|
414
410
|
}
|
|
415
411
|
if (!o.user_id) {
|
|
416
412
|
var obj = await $.get_state(db, token);
|
|
417
413
|
if (obj) {
|
|
414
|
+
o = Object.assign({}, obj.user);
|
|
418
415
|
ctx.session.user = obj.user;
|
|
419
416
|
o.token = ctx.session.uuid;
|
|
420
417
|
obj.state.token = o.token;
|
|
421
418
|
}
|
|
419
|
+
else {
|
|
420
|
+
o = null;
|
|
421
|
+
}
|
|
422
422
|
} else {
|
|
423
423
|
o.token = token;
|
|
424
424
|
}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
// 使用api管理器
|
|
2
|
-
var api = $.api_admin('
|
|
2
|
+
var api = $.api_admin('demo_client', 'demo_client');
|
|
3
3
|
// 首次启动更新api接口;
|
|
4
4
|
api.update();
|
|
5
|
-
|
|
6
5
|
// 使用mysql数据库管理器
|
|
7
6
|
var sql = $.mysql_admin('sys', __dirname);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
sql.setConfig($.config.mysql);
|
|
8
|
+
sql.open();
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* @description 接口主函数
|
|
@@ -16,7 +14,8 @@ var sql = $.mysql_admin('sys', __dirname);
|
|
|
16
14
|
* @return {Object} 执行结果
|
|
17
15
|
*/
|
|
18
16
|
async function main(ctx, db) {
|
|
19
|
-
|
|
17
|
+
$.push(db, sql.db(), true);
|
|
18
|
+
return await api.run(ctx, db);
|
|
20
19
|
};
|
|
21
20
|
|
|
22
21
|
exports.main = main;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
// 路由路径
|
|
3
|
+
"path": "/api/test",
|
|
4
|
+
// 名称, 用于动态增删改API配置
|
|
5
|
+
"name": "demo_test",
|
|
6
|
+
// 标题, 用于开发文档显示
|
|
7
|
+
"title": "示例接口",
|
|
8
|
+
// 描述, 用于介绍该路由的作用
|
|
9
|
+
"description": "描述接口使用方法",
|
|
10
|
+
// 函数文件, 用于驱动脚本, 实现业务
|
|
11
|
+
"func_file": "./index.js",
|
|
12
|
+
// 请求方法, 选填 GET, POST, ALL。 ALL指同时支持GET/POST
|
|
13
|
+
"method": "ALL",
|
|
14
|
+
// 开放域, 如果域未开放, 则只有特定的协议头才能访问该API, 同时API文档不接见
|
|
15
|
+
"scope": true,
|
|
16
|
+
// 缓存时长, 单位: 分钟。使用缓存后, 二次访问API直接从缓存读取, 不重复执行业务脚本
|
|
17
|
+
"cache": 0,
|
|
18
|
+
// 是否启用
|
|
19
|
+
"state": 1,
|
|
20
|
+
// 是否客户端缓存, 使用客户端则不再访问服务器, 直接从浏览器中拿; 使用服务端缓存则会访问服务器
|
|
21
|
+
"client_cache": false,
|
|
22
|
+
// SQL配置路径, 用于将请求参数拼接成SQL, 实现比较复杂的查询
|
|
23
|
+
"sql_path": "./sql.json",
|
|
24
|
+
// 参数配置路径, 用于校验API请求参数是否正确, 同时显示在API文档中
|
|
25
|
+
"param_path": "./param.json",
|
|
26
|
+
/* 授权协议 */
|
|
27
|
+
"oauth": {
|
|
28
|
+
// 是否需要登录, true表示需要登录才能访问该接口
|
|
29
|
+
"signIn": false,
|
|
30
|
+
// 会员权限级别, 如果小于该值, 则无法访问, 0为不限制
|
|
31
|
+
"vip": 0,
|
|
32
|
+
// 管理员权限级别, 如果小于该值, 则无法访问, 0为不限制
|
|
33
|
+
"gm": 0,
|
|
34
|
+
// 商户/第三方权限级别, 如果小于该值, 则无法访问, 0为不限制
|
|
35
|
+
"mc": 0,
|
|
36
|
+
// 用户组, 允许访问该接口的普通用户群体, 传ID数组,例如: [1,5]
|
|
37
|
+
"user_group": [],
|
|
38
|
+
// 管理组, 允许访问该接口的管理员群体, 传ID数组,例如: [1,5]
|
|
39
|
+
"user_admin": []
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 接口主函数
|
|
3
|
+
* @param {Object} ctx HTTP上下文
|
|
4
|
+
* @param {Object} db 数据管理器,如: { next: async function{}, ret: {} }
|
|
5
|
+
* @return {Object} 执行结果
|
|
6
|
+
*/
|
|
7
|
+
async function main(ctx, db) {
|
|
8
|
+
// 获取请求参数
|
|
9
|
+
var req = ctx.request;
|
|
10
|
+
var {
|
|
11
|
+
query,
|
|
12
|
+
body
|
|
13
|
+
} = req;
|
|
14
|
+
|
|
15
|
+
var user = await this.get_state(ctx, db);
|
|
16
|
+
|
|
17
|
+
console.log("用户", user);
|
|
18
|
+
// return "hello world" + JSON.stringify(body);
|
|
19
|
+
|
|
20
|
+
// 操作sql模板
|
|
21
|
+
var m = query.method;
|
|
22
|
+
if (m === "add") {
|
|
23
|
+
|
|
24
|
+
} else if (m === "del") {
|
|
25
|
+
|
|
26
|
+
} else if (m === "set") {
|
|
27
|
+
|
|
28
|
+
} else {
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
var ret = await this.sql.run(query, body, db);
|
|
32
|
+
return ret;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
exports.main = main;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
{
|
|
2
|
+
// 是否启用过滤, 启用过滤后, 不符合的参数会被过滤掉
|
|
3
|
+
"filter": true,
|
|
4
|
+
// 校验脚本文件, 可以使用脚本的方式加一步进行校验, 让传参更加安全
|
|
5
|
+
"func_file": "",
|
|
6
|
+
// get请求
|
|
7
|
+
"get": {
|
|
8
|
+
// 查询参数校验项
|
|
9
|
+
"query": ["uid", "name", "username", "phone", "email"],
|
|
10
|
+
// 查询必填参数
|
|
11
|
+
"query_required": []
|
|
12
|
+
},
|
|
13
|
+
// post请求
|
|
14
|
+
"post": {
|
|
15
|
+
// 查询参数校验项
|
|
16
|
+
"query": ["uid", "name", "username", "phone", "email"],
|
|
17
|
+
// 查询必填参数
|
|
18
|
+
"query_required": [],
|
|
19
|
+
// 正文参数校验项
|
|
20
|
+
"body": ["age", "headImg", "birthday", "password", "confirm_password", "pay_password"],
|
|
21
|
+
// 正文必填参数
|
|
22
|
+
"body_required": []
|
|
23
|
+
},
|
|
24
|
+
// 校验列表
|
|
25
|
+
"list": [{
|
|
26
|
+
// 参数key名
|
|
27
|
+
"name": "uid",
|
|
28
|
+
// 参数中文名
|
|
29
|
+
"title": "用户ID",
|
|
30
|
+
// 数据类型
|
|
31
|
+
"type": "number",
|
|
32
|
+
// 数字类型时设置
|
|
33
|
+
"number": {
|
|
34
|
+
// 最小数值
|
|
35
|
+
"min": 1
|
|
36
|
+
},
|
|
37
|
+
// 分隔参数,允许传多个值,为空则限制1个值
|
|
38
|
+
"splitter": "|"
|
|
39
|
+
}, {
|
|
40
|
+
"name": "name",
|
|
41
|
+
"title": "姓名",
|
|
42
|
+
"type": "string",
|
|
43
|
+
// 字符串类型时设置
|
|
44
|
+
"string": {
|
|
45
|
+
// 格式
|
|
46
|
+
"format": "ch",
|
|
47
|
+
// 传值范围,字符串时为限制字符长度
|
|
48
|
+
"range": [2, 6]
|
|
49
|
+
},
|
|
50
|
+
"splitter": "|"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "age",
|
|
54
|
+
"title": "年龄",
|
|
55
|
+
"type": "number",
|
|
56
|
+
"number": {
|
|
57
|
+
// 传值范围,数字时为最小值和最大值
|
|
58
|
+
"range": [1, 150]
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "headImg",
|
|
63
|
+
"title": "头像",
|
|
64
|
+
"type": "string",
|
|
65
|
+
"string": {
|
|
66
|
+
// 拓展名,用于传媒体(图片、音频、视频)时
|
|
67
|
+
"extension": "png|gif|jpg|jpeg|bmp"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "birthday",
|
|
72
|
+
"title": "生日",
|
|
73
|
+
"type": "string",
|
|
74
|
+
"string": {
|
|
75
|
+
"format": "dateISO"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"name": "username",
|
|
80
|
+
"title": "用户名",
|
|
81
|
+
"type": "string",
|
|
82
|
+
"string": {
|
|
83
|
+
"format": "username"
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "password",
|
|
88
|
+
"title": "密码",
|
|
89
|
+
"type": "string",
|
|
90
|
+
"string": {
|
|
91
|
+
"format": "password",
|
|
92
|
+
"different": "username"
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "phone",
|
|
97
|
+
"title": "手机",
|
|
98
|
+
"type": "string",
|
|
99
|
+
"string": {
|
|
100
|
+
"format": "phone"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "email",
|
|
105
|
+
"title": "邮箱",
|
|
106
|
+
"type": "string",
|
|
107
|
+
"string": {
|
|
108
|
+
"format": "email"
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "pay_password",
|
|
113
|
+
"title": "支付密码",
|
|
114
|
+
"type": "string",
|
|
115
|
+
"string": {
|
|
116
|
+
"format": "num",
|
|
117
|
+
"different": "password"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"name": "confirm_password",
|
|
122
|
+
"title": "确认密码",
|
|
123
|
+
"type": "string",
|
|
124
|
+
"string": {
|
|
125
|
+
"format": "password",
|
|
126
|
+
"identical": "password"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
]
|
|
130
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
// SQL模板标题
|
|
3
|
+
"title": "示例sql模板",
|
|
4
|
+
// 调用的数据表
|
|
5
|
+
"table": "user_account",
|
|
6
|
+
// 表主键,用于getObj查询时
|
|
7
|
+
"key": "user_id",
|
|
8
|
+
// 排序方式,{0}表示支持前端传值来排序,传值方式例如:orderby=user_id
|
|
9
|
+
"orderby": "{0}",
|
|
10
|
+
// 默认排序方式,当前端没有传值的情况下,采用默认传值方式
|
|
11
|
+
"orderby_default": "`user_id` desc",
|
|
12
|
+
// 查询列表时返回的字段,{0}表示支持前端传值
|
|
13
|
+
"field": "{0}",
|
|
14
|
+
// 查询对象时返回的字段
|
|
15
|
+
"field_obj": "{0}",
|
|
16
|
+
// 默认返回字段
|
|
17
|
+
"field_default": "`username`, `phone`",
|
|
18
|
+
// 需要过滤的字段,*代表泛匹配 前面*表示以xxx结尾,后面*表示以xxx开头,前后*表示包含xxx的过滤
|
|
19
|
+
"field_hide": ["*password*", "*token*"],
|
|
20
|
+
// 传值分隔符,如果允许多个值,可以通过这个来分割,如果不允许传多个值则设置为空
|
|
21
|
+
"separator": "|",
|
|
22
|
+
// 关键词,用于过滤掉这些值不会写到查询条件中,同时用来识别传的参数
|
|
23
|
+
"keyword": {
|
|
24
|
+
// 数据表名,当"table":"{0}", 允许识别表明
|
|
25
|
+
"table": "table",
|
|
26
|
+
// 排序方式
|
|
27
|
+
"orderby": "orderby",
|
|
28
|
+
// 查询的字段
|
|
29
|
+
"field": "field",
|
|
30
|
+
// 页码
|
|
31
|
+
"page": "page",
|
|
32
|
+
// 页面大小
|
|
33
|
+
"size": "size",
|
|
34
|
+
// 总计,返回查询结果总数
|
|
35
|
+
"count": "count",
|
|
36
|
+
// 调用方式
|
|
37
|
+
"method": "method"
|
|
38
|
+
},
|
|
39
|
+
// 调用方式 add增 del删 set改 get查 get_obj查一条 import导入 export导出, 支持什么方式就传什么值,支持多个用空格分隔
|
|
40
|
+
"method": "add del set get get_obj import export del_repeat sum count update",
|
|
41
|
+
// 查询条件转换
|
|
42
|
+
"query": {
|
|
43
|
+
// 当username=xx时,转为`username` like '%xxx%'的SQL语法
|
|
44
|
+
"username": "`username` like '%{0}%'"
|
|
45
|
+
},
|
|
46
|
+
// 修改时的查询条件
|
|
47
|
+
"where": {
|
|
48
|
+
// 当修改查询条件出现user_id=xx时,转为`user_id` = 'xxx'的SQL语法
|
|
49
|
+
"user_id": "`user_id` = '{0}'"
|
|
50
|
+
},
|
|
51
|
+
// 修改时值转换
|
|
52
|
+
"update": {
|
|
53
|
+
// 当修改的正文中出现username是转换为指定格式
|
|
54
|
+
"username": "`username` = '{0}'"
|
|
55
|
+
},
|
|
56
|
+
// 默认查询条件
|
|
57
|
+
"query_dedefault": {
|
|
58
|
+
|
|
59
|
+
},
|
|
60
|
+
// 默认添加项
|
|
61
|
+
"body_default": {
|
|
62
|
+
|
|
63
|
+
},
|
|
64
|
+
// SQL执行脚本,当设置js文件名后, 执行该SQL还将调用这个脚本
|
|
65
|
+
"func_file": "",
|
|
66
|
+
// 导入导出格式,转换导入、导出Eexcel时字段名和字段值
|
|
67
|
+
"format": [],
|
|
68
|
+
// 去重条件,需要查重、并去重的字段在这里写
|
|
69
|
+
"del_repeat": {}
|
|
70
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mm_os",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.9",
|
|
4
4
|
"description": "这是超级美眉服务端框架,用于快速构建应用程序。",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"mm_mysql": "^1.8.1",
|
|
48
48
|
"mm_redis": "^1.4.2",
|
|
49
49
|
"mm_ret": "^1.3.9",
|
|
50
|
-
"mm_session": "^1.4.
|
|
50
|
+
"mm_session": "^1.4.8",
|
|
51
51
|
"mm_statics": "^1.4.2",
|
|
52
52
|
"mm_tpl": "^2.3.9",
|
|
53
53
|
"mm_xml": "^1.1.5",
|