crabatool 1.0.381 → 1.0.382
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/apis/data.js +152 -0
- package/apis/init.js +72 -0
- package/apis/menu.js +64 -0
- package/lib/handler.js +17 -3
- package/lib/jsoncrud.js +2 -5
- package/package.json +1 -1
package/apis/data.js
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
var path = require('path');
|
|
2
|
+
var crabatool = require('../index.js');
|
|
3
|
+
var utils = crabatool.utils;
|
|
4
|
+
var JSONCRUD = crabatool.JSONCRUD;
|
|
5
|
+
|
|
6
|
+
class data {
|
|
7
|
+
constructor() {
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
_init(webPath) {
|
|
12
|
+
if (this.db) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
this.db = new JSONCRUD({ storagePath: path.join(webPath, '../data/data.json') });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async get(req, res) {
|
|
19
|
+
var body = utils.getReqBody(req);
|
|
20
|
+
var that = this;
|
|
21
|
+
|
|
22
|
+
var queryParams = body.queryParams;
|
|
23
|
+
var filterParams = body.filter;
|
|
24
|
+
var items = null;
|
|
25
|
+
if (filterParams && filterParams.items && filterParams.items.length > 0) {
|
|
26
|
+
items = filterParams.items;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (queryParams) {
|
|
30
|
+
var keys = Object.keys(queryParams);
|
|
31
|
+
if (!items) {
|
|
32
|
+
items = [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
keys.forEach(function(key) {
|
|
36
|
+
if (that._isEmpty(queryParams[key])) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
var index = items.findIndex(function(item) {
|
|
41
|
+
return item.dataField == key;
|
|
42
|
+
});
|
|
43
|
+
if (index > -1) {
|
|
44
|
+
items.splice(index, 1); // 删除filter里面的字段,queryParams优先级大于filter
|
|
45
|
+
}
|
|
46
|
+
items.push({ dataField: key, type: 0, value: queryParams[key] });
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
var info = await this.db.find(body.name, {
|
|
51
|
+
page: body.pageIndex,
|
|
52
|
+
pageSize: body.pageSize,
|
|
53
|
+
filterFunc: function(item) {
|
|
54
|
+
if (items && items.length > 0) {
|
|
55
|
+
return that._locateRowToCache(item, items);
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
crabatool.utils.end(res, {
|
|
62
|
+
code: 200,
|
|
63
|
+
msg: '操作成功',
|
|
64
|
+
data: info.data,
|
|
65
|
+
count: info.pageData.count
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async save(req, res) {
|
|
70
|
+
var body = utils.getReqBody(req);
|
|
71
|
+
|
|
72
|
+
var newData;
|
|
73
|
+
if (body.data.id) {
|
|
74
|
+
newData = await this.db.update(body.name, body.data.id, body.data);
|
|
75
|
+
} else {
|
|
76
|
+
newData = await this.db.create(body.name, body.data);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
crabatool.utils.end(res, {
|
|
80
|
+
code: 200,
|
|
81
|
+
msg: '操作成功',
|
|
82
|
+
data: newData
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async delete(req, res) {
|
|
87
|
+
var body = utils.getReqBody(req);
|
|
88
|
+
|
|
89
|
+
var result = await this.db.delete(body.name, body.data.id);
|
|
90
|
+
|
|
91
|
+
crabatool.utils.end(res, {
|
|
92
|
+
code: 200,
|
|
93
|
+
msg: '操作成功',
|
|
94
|
+
data: result
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
_locateRowToCache(record, items) {
|
|
99
|
+
var ok = false;
|
|
100
|
+
var like = true;
|
|
101
|
+
|
|
102
|
+
for (var j = 0, count2 = items.length; j < count2; j++) {
|
|
103
|
+
var item = items[j];
|
|
104
|
+
|
|
105
|
+
var propName = item.dataField;
|
|
106
|
+
var propValue = item.value;
|
|
107
|
+
var v = record[propName];
|
|
108
|
+
var useLike = like && item.type != 2;
|
|
109
|
+
|
|
110
|
+
if (item.type == 7) {
|
|
111
|
+
ok = item.value.includes(v);
|
|
112
|
+
if (ok == false) break;
|
|
113
|
+
} else if (item.type == 1) {
|
|
114
|
+
if (item.value1 instanceof Date && typeof v == 'string') {
|
|
115
|
+
v = Date.strToDateTime(v);
|
|
116
|
+
}
|
|
117
|
+
if (v >= item.value1 && v <= item.value2) {
|
|
118
|
+
ok = true;
|
|
119
|
+
} else if (v >= item.value1 && this._isUndefinedOrNull(item.value2) || v <= item.value2 && this._isUndefinedOrNull(item.value1)) {
|
|
120
|
+
ok = true;
|
|
121
|
+
} else {
|
|
122
|
+
ok = false;
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
} else if (useLike) {
|
|
126
|
+
if (!this._isUndefinedOrNull(v) && v.toString().toLowerCase().indexOf(propValue.toString().toLowerCase()) > -1) {
|
|
127
|
+
ok = true;
|
|
128
|
+
} else {
|
|
129
|
+
ok = false;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
if (v == propValue) {
|
|
134
|
+
ok = true;
|
|
135
|
+
} else {
|
|
136
|
+
ok = false;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return ok;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
_isUndefinedOrNull(v) {
|
|
145
|
+
return v === null || v === undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
_isEmpty(v) {
|
|
149
|
+
return v === '' || this._isUndefinedOrNull(v);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports = module.exports = new data();
|
package/apis/init.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
var crypto = require('crypto-js');
|
|
2
|
+
var request = require('request');
|
|
3
|
+
|
|
4
|
+
var AccessToken = null;
|
|
5
|
+
class init {
|
|
6
|
+
async printToken(req, res) {
|
|
7
|
+
if (AccessToken) {
|
|
8
|
+
return res.send({
|
|
9
|
+
code: 200,
|
|
10
|
+
msg: '成功',
|
|
11
|
+
AccessToken: AccessToken
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
var ProductName = "Default";
|
|
16
|
+
var ProductVersion = "1.0.0";
|
|
17
|
+
|
|
18
|
+
var params = {
|
|
19
|
+
visitor: 'aaa',
|
|
20
|
+
productName: ProductName,
|
|
21
|
+
productVersion: ProductVersion,
|
|
22
|
+
callBackUrl: ''
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
request({
|
|
26
|
+
url: this._getAppTokenUrl(JSON.stringify(params)),
|
|
27
|
+
method: "POST",
|
|
28
|
+
json: true,
|
|
29
|
+
headers: { "content-type": "application/json" },
|
|
30
|
+
body: params
|
|
31
|
+
}, function(error, response, result) {
|
|
32
|
+
console.log(result) // 请求成功的处理逻辑
|
|
33
|
+
if (!result) {
|
|
34
|
+
result = {};
|
|
35
|
+
}
|
|
36
|
+
AccessToken = result.accessToken;
|
|
37
|
+
|
|
38
|
+
res.send({
|
|
39
|
+
code: 200,
|
|
40
|
+
msg: '成功',
|
|
41
|
+
AccessToken: AccessToken
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_getAppTokenUrl(body) {
|
|
47
|
+
var ServiceUrl = "//teemoapitest1.zhangyuxia.com.cn/";
|
|
48
|
+
var Appkey = "38669EB53BFDF2A8A0FDCCBDB2538500";
|
|
49
|
+
var Appsecret = "46458A604792946B56A6546C3374D9AA";
|
|
50
|
+
|
|
51
|
+
var timestamp = (new Date()).toString("yyyyMMddHHmmss");
|
|
52
|
+
var paramsDic = {
|
|
53
|
+
"appKey": Appkey,
|
|
54
|
+
"method": "GetAppToken",
|
|
55
|
+
"timestamp": timestamp
|
|
56
|
+
};
|
|
57
|
+
var methodParams = ["appKey", "method", "timestamp"];
|
|
58
|
+
var signStr = "";
|
|
59
|
+
signStr += Appsecret;
|
|
60
|
+
var paramStr = "";
|
|
61
|
+
methodParams.forEach(function(param) {
|
|
62
|
+
signStr += (param + paramsDic[param]);
|
|
63
|
+
paramStr += (param + "=" + paramsDic[param] + "&");
|
|
64
|
+
});
|
|
65
|
+
signStr += body;
|
|
66
|
+
signStr += Appsecret;
|
|
67
|
+
paramStr += ("sign=" + crypto.MD5(signStr).toString());
|
|
68
|
+
|
|
69
|
+
return "http:" + ServiceUrl + "ReportService.gspx" + "?" + paramStr;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports = module.exports = new init();
|
package/apis/menu.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
var fs = require('fs');
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var crabatool = require('../index.js');
|
|
5
|
+
var utils = crabatool.utils;
|
|
6
|
+
var menusPath = null;
|
|
7
|
+
|
|
8
|
+
class menu {
|
|
9
|
+
_init(webPath) {
|
|
10
|
+
if (menusPath) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
menusPath = path.join(webPath, './data/menus.json');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 返回菜单数据
|
|
17
|
+
async get(req, res) {
|
|
18
|
+
var body = utils.getReqBody(req);
|
|
19
|
+
var menus = this._getMenus();
|
|
20
|
+
if (body.type != 'list') {
|
|
21
|
+
var node = { ChildNodes: [] };
|
|
22
|
+
this._convertListToMenu(node, menus, 0);
|
|
23
|
+
menus = node;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
crabatool.utils.end(res, {
|
|
27
|
+
code: 200,
|
|
28
|
+
msg: '操作成功',
|
|
29
|
+
data: menus
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
_getMenus() {
|
|
34
|
+
var menus;
|
|
35
|
+
if (fs.existsSync(menusPath)) {
|
|
36
|
+
var data = fs.readFileSync(menusPath).toString();
|
|
37
|
+
menus = JSON.parse(data);
|
|
38
|
+
} else {
|
|
39
|
+
menus = [];
|
|
40
|
+
}
|
|
41
|
+
return menus;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
_convertListToMenu(node, list, pid) {
|
|
45
|
+
var items = list.filter(function(item) {
|
|
46
|
+
return item.pid == pid;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
var self = this;
|
|
50
|
+
items.forEach(function(rowData) {
|
|
51
|
+
var child = { ChildNodes: [] };
|
|
52
|
+
child.Text = rowData.text;
|
|
53
|
+
child.Icon = rowData.icon;
|
|
54
|
+
child.ShowPage = rowData.showPage;
|
|
55
|
+
child.CssClass = rowData.level == 1 ? 'MenuText' : rowData.cssClass;
|
|
56
|
+
child.BeginGroup = rowData.level == 1 ? true : false;
|
|
57
|
+
child.Param = { id: rowData.id };
|
|
58
|
+
node.ChildNodes.push(child);
|
|
59
|
+
|
|
60
|
+
self._convertListToMenu(child, list, rowData.id);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports = module.exports = new menu();
|
package/lib/handler.js
CHANGED
|
@@ -24,7 +24,17 @@ class Handler {
|
|
|
24
24
|
// 从server目录下找api实现
|
|
25
25
|
if (apiPath.indexOf('/') > 0) {
|
|
26
26
|
var name = apiPath.substr(0, apiPath.indexOf('/'));
|
|
27
|
-
var apiJs =
|
|
27
|
+
var apiJs = '';
|
|
28
|
+
var webPath = req.app.webPath;
|
|
29
|
+
if (name == 'crabatool') { // /apis/crabatool/init/printToken
|
|
30
|
+
var arr = apiPath.split('/');
|
|
31
|
+
name = arr[1];
|
|
32
|
+
arr.shift(); // 移除crabatool的路径,保留:init/printToken
|
|
33
|
+
apiPath = arr.join('/');
|
|
34
|
+
apiJs = path.join(__dirname, '../', apiStart, name + ".js");
|
|
35
|
+
} else {
|
|
36
|
+
apiJs = path.join(webPath, '../', apiStart, name + ".js");
|
|
37
|
+
}
|
|
28
38
|
if (!fs.existsSync(apiJs)) {
|
|
29
39
|
return next();
|
|
30
40
|
}
|
|
@@ -33,12 +43,16 @@ class Handler {
|
|
|
33
43
|
return next();
|
|
34
44
|
}
|
|
35
45
|
name = apiPath.substr(apiPath.indexOf('/') + 1);
|
|
36
|
-
if (name.startsWith('_'))
|
|
46
|
+
if (name.startsWith('_')) {
|
|
47
|
+
return next(); // 私有函数不能访问
|
|
48
|
+
}
|
|
37
49
|
var fun = targetApi[name];
|
|
38
50
|
if (!fun) {
|
|
39
51
|
return next();
|
|
40
52
|
}
|
|
41
|
-
|
|
53
|
+
if (typeof targetApi._init == 'function') {
|
|
54
|
+
targetApi._init(webPath);
|
|
55
|
+
}
|
|
42
56
|
//req.session.t = (new Date()).getTime(); // 防止session过期
|
|
43
57
|
try {
|
|
44
58
|
return await fun.apply(targetApi, [req, res]);
|
package/lib/jsoncrud.js
CHANGED
|
@@ -67,7 +67,7 @@ class JSONCRUD {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
async find(entityName, {
|
|
70
|
-
|
|
70
|
+
filter = () => true,
|
|
71
71
|
page = 1,
|
|
72
72
|
pageSize = 10,
|
|
73
73
|
sortBy = 'createdAt',
|
|
@@ -76,10 +76,7 @@ class JSONCRUD {
|
|
|
76
76
|
await this.ready()
|
|
77
77
|
this.verifyEntityExists(entityName)
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
if (typeof filterFunc == 'function') {
|
|
81
|
-
allData = allData.filter(filterFunc);
|
|
82
|
-
}
|
|
79
|
+
const allData = [...this.entities[entityName].data]
|
|
83
80
|
const sorted = allData.sort((a, b) => {
|
|
84
81
|
sortOrder === 'asc' ?
|
|
85
82
|
a[sortBy]?.localeCompare(b[sortBy]) :
|