crabatool 1.0.382 → 1.0.384
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/homeai.js +431 -0
- package/apis/menu.js +13 -4
- package/package.json +1 -1
package/apis/homeai.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
|
|
2
|
+
var fs = require('fs');
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var crabatool = require('../index.js');
|
|
5
|
+
var utils = crabatool.utils;
|
|
6
|
+
var axios = require('axios');
|
|
7
|
+
var webPath, menuPath;
|
|
8
|
+
var aiHost = 'http://172.17.0.201:9996/apis/fast/';
|
|
9
|
+
//var aiHost = 'http://127.0.0.1:9996/apis/fast/';
|
|
10
|
+
|
|
11
|
+
var funcList = {
|
|
12
|
+
'新建菜单': '_createItem',
|
|
13
|
+
'新建子菜单': '_createItem',
|
|
14
|
+
'删除菜单': '_delMenuItem',
|
|
15
|
+
'修改菜单': '_modifyMenuItem',
|
|
16
|
+
'导入Excel': '_doExcel',
|
|
17
|
+
'新建页面': '_createPage',
|
|
18
|
+
'新建弹窗': '_createPage',
|
|
19
|
+
'修改页面': '_createPage'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
class homeai {
|
|
23
|
+
_init(wp) {
|
|
24
|
+
if (webPath) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
webPath = wp;
|
|
29
|
+
menuPath = path.join(wp, 'data/menus.json');
|
|
30
|
+
|
|
31
|
+
if (!fs.existsSync(menuPath)) {
|
|
32
|
+
utils.mkdirsSync(menuPath);
|
|
33
|
+
fs.writeFileSync(menuPath, '[]');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async execute(req, res) {
|
|
38
|
+
var body = utils.getReqBody(req);
|
|
39
|
+
var text = body.text;
|
|
40
|
+
var name = text.split('(')[0];
|
|
41
|
+
|
|
42
|
+
var func = this[funcList[name]];
|
|
43
|
+
if (typeof func != 'function') {
|
|
44
|
+
utils.end(res, {
|
|
45
|
+
code: 500,
|
|
46
|
+
msg: '没有实现该命令'
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func.apply(this, [name, text, req, res]);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
_createItem(name, text, req, res) {
|
|
55
|
+
var menus = this._getMenus();
|
|
56
|
+
var str = this._getExpress(text).trim();
|
|
57
|
+
if (!str) {
|
|
58
|
+
utils.end(res, {
|
|
59
|
+
code: 500,
|
|
60
|
+
msg: '缺少菜单相关数据'
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
var items = str.split('+'); // 菜单1+菜单2+菜单3
|
|
66
|
+
var firstText = items[0];
|
|
67
|
+
|
|
68
|
+
if (items.length == 1) {
|
|
69
|
+
if (name == '新建子菜单') {
|
|
70
|
+
utils.end(res, {
|
|
71
|
+
code: 500,
|
|
72
|
+
msg: '缺少子菜单数据'
|
|
73
|
+
});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 新建a1
|
|
78
|
+
var item = { text: firstText, id: crabatool.cuid.newCuidString(), pid: 0 };
|
|
79
|
+
menus.push(item);
|
|
80
|
+
} else {
|
|
81
|
+
// a1之后新建a2,a3
|
|
82
|
+
var targetItem = menus.filter(function(item) {
|
|
83
|
+
return item.text == firstText;
|
|
84
|
+
})[0];
|
|
85
|
+
|
|
86
|
+
var pid = 0;
|
|
87
|
+
var index = 0;
|
|
88
|
+
if (targetItem) {
|
|
89
|
+
if (name == '新建子菜单') {
|
|
90
|
+
pid = targetItem.id;
|
|
91
|
+
} else {
|
|
92
|
+
pid = targetItem.pid;
|
|
93
|
+
}
|
|
94
|
+
index = menus.indexOf(targetItem);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
for (var i = 0; i < items.length; i++) {
|
|
98
|
+
if (targetItem && i == 0) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
var item = { text: items[i], id: crabatool.cuid.newCuidString(), pid: pid };
|
|
102
|
+
if (index > 0) {
|
|
103
|
+
menus.splice(index + 1, 0, item);
|
|
104
|
+
} else {
|
|
105
|
+
menus.push(item);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (!targetItem && i == 0 && name == '新建子菜单') {
|
|
109
|
+
pid = item.id;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this._saveMenus(menus);
|
|
115
|
+
|
|
116
|
+
var node = require('./menu.js')._convertListToMenu(null, menus, 0);
|
|
117
|
+
utils.end(res, {
|
|
118
|
+
code: 200,
|
|
119
|
+
msg: '操作成功',
|
|
120
|
+
type: 'menu',
|
|
121
|
+
data: node
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
_delMenuItem(name, text, req, res) {
|
|
126
|
+
var menus = this._getMenus();
|
|
127
|
+
var str = this._getExpress(text).trim();
|
|
128
|
+
if (!str) {
|
|
129
|
+
utils.end(res, {
|
|
130
|
+
code: 500,
|
|
131
|
+
msg: '缺少菜单相关数据'
|
|
132
|
+
});
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
var items = str.split('+'); // 菜单1+菜单2+菜单3
|
|
137
|
+
for (var i = 0; i < items.length; i++) {
|
|
138
|
+
var itext = items[i];
|
|
139
|
+
|
|
140
|
+
menus = menus.filter(function(item) {
|
|
141
|
+
return item.text != itext;
|
|
142
|
+
});
|
|
143
|
+
// 先不管子菜单了
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
this._saveMenus(menus);
|
|
147
|
+
var node = require('./menu.js')._convertListToMenu(null, menus, 0);
|
|
148
|
+
utils.end(res, {
|
|
149
|
+
code: 200,
|
|
150
|
+
msg: '操作成功',
|
|
151
|
+
type: 'menu',
|
|
152
|
+
data: node
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
_modifyMenuItem(name, text, req, res) {
|
|
157
|
+
var menus = this._getMenus();
|
|
158
|
+
var str = this._getExpress(text).trim();
|
|
159
|
+
if (!str) {
|
|
160
|
+
utils.end(res, {
|
|
161
|
+
code: 500,
|
|
162
|
+
msg: '缺少菜单相关数据'
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
var items = str.split('+'); // 菜单1+菜单2+菜单3
|
|
168
|
+
if (items.length != 2) {
|
|
169
|
+
utils.end(res, {
|
|
170
|
+
code: 500,
|
|
171
|
+
msg: '请传入老的菜单名和新菜单名,如:修改菜单(老菜单名,新菜单名)'
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
menus.forEach(function(item) {
|
|
177
|
+
if (item.text == items[0]) {
|
|
178
|
+
item.text = items[1];
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
this._saveMenus(menus);
|
|
183
|
+
var node = require('./menu.js')._convertListToMenu(null, menus, 0);
|
|
184
|
+
utils.end(res, {
|
|
185
|
+
code: 200,
|
|
186
|
+
msg: '操作成功',
|
|
187
|
+
type: 'menu',
|
|
188
|
+
data: node
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
_doExcel(name, text, req, res) {
|
|
193
|
+
var body = utils.getReqBody(req);
|
|
194
|
+
var data = body.data;
|
|
195
|
+
var itemText = this._getExpress(text).trim();
|
|
196
|
+
if (!itemText || itemText.includes('+')) {
|
|
197
|
+
utils.end(res, {
|
|
198
|
+
code: 500,
|
|
199
|
+
msg: '缺少菜单相关数据或菜单数据不是单个菜单'
|
|
200
|
+
});
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (!data || !data.type || !data.list || data.list.length == 0 || !data.name) {
|
|
204
|
+
utils.end(res, {
|
|
205
|
+
code: 500,
|
|
206
|
+
msg: '缺少Excel相关数据'
|
|
207
|
+
});
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
var that = this;
|
|
212
|
+
this._postAI('excelToPage', data, function(resdata, error) {
|
|
213
|
+
if (resdata !== false && resdata.code == 200) {
|
|
214
|
+
that._saveExcelData(itemText, resdata.data, res);
|
|
215
|
+
} else {
|
|
216
|
+
utils.end(res, {
|
|
217
|
+
code: 500,
|
|
218
|
+
msg: 'crabaai异常,操作失败:' + error
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
_saveExcelData(itemText, data, res) {
|
|
225
|
+
var dataPath = path.join(webPath, '../data/data.json');
|
|
226
|
+
var dataInfo = {};
|
|
227
|
+
if (fs.existsSync(dataPath)) {
|
|
228
|
+
var json = fs.readFileSync(dataPath);
|
|
229
|
+
dataInfo = JSON.parse(json);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// 实体数据
|
|
233
|
+
var entityDatas = data.entityDatas;
|
|
234
|
+
Object.assign(dataInfo, entityDatas);
|
|
235
|
+
utils.mkdirsSync(dataPath);
|
|
236
|
+
fs.writeFileSync(dataPath, JSON.stringify(dataInfo));
|
|
237
|
+
|
|
238
|
+
// 菜单数据
|
|
239
|
+
var menus = this._getMenus();
|
|
240
|
+
|
|
241
|
+
// 找菜单
|
|
242
|
+
var item = menus.filter(function(item) {
|
|
243
|
+
return item.text == itemText;
|
|
244
|
+
})[0];
|
|
245
|
+
|
|
246
|
+
var sheetItem = data.menus[0];
|
|
247
|
+
if (item) {
|
|
248
|
+
if (item.showPage) {
|
|
249
|
+
var index = menus.indexOf(item);
|
|
250
|
+
menus.splice(index + 1, 0, sheetItem); // 插入到之后
|
|
251
|
+
data.menus.shift(); // 删掉第一个
|
|
252
|
+
} else {
|
|
253
|
+
sheetItem.pid = item.id; // 作为子级
|
|
254
|
+
}
|
|
255
|
+
} else {
|
|
256
|
+
sheetItem.pid = 0;
|
|
257
|
+
sheetItem.text = itemText; // 作为新菜单
|
|
258
|
+
}
|
|
259
|
+
// 关联菜单
|
|
260
|
+
menus = menus.concat(data.menus);
|
|
261
|
+
|
|
262
|
+
// 保存菜单
|
|
263
|
+
this._saveMenus(menus);
|
|
264
|
+
|
|
265
|
+
// 转换菜单结构
|
|
266
|
+
var node = require('./menu.js')._convertListToMenu(null, menus, 0);
|
|
267
|
+
|
|
268
|
+
// 创建列表页面
|
|
269
|
+
this._buildChildPage(data);
|
|
270
|
+
|
|
271
|
+
// 输出
|
|
272
|
+
utils.end(res, {
|
|
273
|
+
code: 200,
|
|
274
|
+
msg: '操作成功',
|
|
275
|
+
type: 'menu',
|
|
276
|
+
targetItem: sheetItem.id,
|
|
277
|
+
data: node
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
_savePage(name, itemText, data, res) {
|
|
282
|
+
// 菜单数据
|
|
283
|
+
var menus = this._getMenus();
|
|
284
|
+
|
|
285
|
+
var pageUrl = `Pages/${data.enname}.gspx`;
|
|
286
|
+
if (name == '新建弹窗') {
|
|
287
|
+
var item = { id: crabatool.cuid.newCuidString(), pid: 0, text: itemText, onClick: 'doShowModal', param: { pageUrl: pageUrl } };
|
|
288
|
+
menus.push(item);
|
|
289
|
+
} else {
|
|
290
|
+
// 找菜单
|
|
291
|
+
var item = menus.filter(function(item) {
|
|
292
|
+
return item.text == itemText;
|
|
293
|
+
})[0];
|
|
294
|
+
|
|
295
|
+
if (name == '修改页面' && item) {
|
|
296
|
+
item.showPage = pageUrl;
|
|
297
|
+
} else {
|
|
298
|
+
item = { id: crabatool.cuid.newCuidString(), pid: 0, text: itemText, showPage: pageUrl };
|
|
299
|
+
menus.push(item);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// 保存菜单
|
|
304
|
+
this._saveMenus(menus);
|
|
305
|
+
|
|
306
|
+
// 转换菜单结构
|
|
307
|
+
var node = require('./menu.js')._convertListToMenu(null, menus, 0);
|
|
308
|
+
|
|
309
|
+
// 创建页面
|
|
310
|
+
this._buildPage(data);
|
|
311
|
+
|
|
312
|
+
// 输出
|
|
313
|
+
utils.end(res, {
|
|
314
|
+
code: 200,
|
|
315
|
+
msg: '操作成功',
|
|
316
|
+
type: 'menu',
|
|
317
|
+
//targetItem: sheetItem.id,
|
|
318
|
+
data: node
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
_createPage(name, text, req, res) {
|
|
323
|
+
var body = utils.getReqBody(req);
|
|
324
|
+
var express = this._getExpress(text).trim();
|
|
325
|
+
if (!express) {
|
|
326
|
+
utils.end(res, {
|
|
327
|
+
code: 500,
|
|
328
|
+
msg: '缺少布局表达式'
|
|
329
|
+
});
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
// 校验菜单名和表达式
|
|
333
|
+
var index = express.indexOf('+');
|
|
334
|
+
var itemName = express.split('+')[0]; // 菜单名
|
|
335
|
+
var express = express.substr(index + 1); // 表达式
|
|
336
|
+
if (!itemName || !express) {
|
|
337
|
+
utils.end(res, {
|
|
338
|
+
code: 500,
|
|
339
|
+
msg: '缺少菜单名或者布局表达式'
|
|
340
|
+
});
|
|
341
|
+
return;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
var that = this;
|
|
345
|
+
var pageName = crabatool.stringUtils.getPinyinCode(itemName) + crabatool.cuid.newCuid(); // 防止同名菜单重复页面
|
|
346
|
+
this._postAI('expressToPage', { express: express, name: itemName, enname: pageName }, function(resdata, error) {
|
|
347
|
+
if (resdata !== false && resdata.code == 200) {
|
|
348
|
+
that._savePage(name, itemName, resdata.data, res);
|
|
349
|
+
} else {
|
|
350
|
+
utils.end(res, {
|
|
351
|
+
code: 500,
|
|
352
|
+
msg: 'crabaai异常,操作失败:' + error
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
_buildChildPage(pdata) {
|
|
359
|
+
var datas = pdata.childInfos;
|
|
360
|
+
if (!datas || datas.length == 0) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
var that = this;
|
|
365
|
+
datas.forEach(function(data) {
|
|
366
|
+
that._buildPage(data);
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
_buildPage(data) {
|
|
371
|
+
var gspxPath = path.join(webPath, 'Pages', data.enname + '.gspx');
|
|
372
|
+
var jsPath = path.join(webPath, 'Pages', data.enname + '.js');
|
|
373
|
+
|
|
374
|
+
utils.mkdirsSync(gspxPath);
|
|
375
|
+
fs.writeFileSync(gspxPath, data.gspx);
|
|
376
|
+
fs.writeFileSync(jsPath, data.js);
|
|
377
|
+
|
|
378
|
+
// 创建编辑页面
|
|
379
|
+
var editInfo = data.editInfo;
|
|
380
|
+
if (editInfo) {
|
|
381
|
+
var gspxPath = path.join(webPath, 'Pages', editInfo.enname + 'BianJi.gspx');
|
|
382
|
+
var jsPath = path.join(webPath, 'Pages', editInfo.enname + 'BianJi.js');
|
|
383
|
+
fs.writeFileSync(gspxPath, editInfo.gspx);
|
|
384
|
+
fs.writeFileSync(jsPath, editInfo.js);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
_getExpress(str) {
|
|
389
|
+
var index = str.indexOf('(');
|
|
390
|
+
var text = str.substring(index + 1, str.length - 1);
|
|
391
|
+
|
|
392
|
+
text = text.replace(/[()]/g, c => (c === '(' ? '(' : ')')) // 转换中文括号为英文
|
|
393
|
+
.replace(/[\[\]]/g, c => (c === '[' ? '(' : ')')) // 转换[]括号为英文()
|
|
394
|
+
.replace(/[,,]/g, c => ('+')) // 中英文逗号都转换为+
|
|
395
|
+
.replace(/\s*([+|()])\s*/g, '$1') // 移除符号周围的空格
|
|
396
|
+
|
|
397
|
+
return text;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
_postAI(url, data, cb) {
|
|
401
|
+
axios({
|
|
402
|
+
method: 'post',
|
|
403
|
+
url: aiHost + url,
|
|
404
|
+
data: data,
|
|
405
|
+
headers: { 'Content-Type': 'application/json' }
|
|
406
|
+
}).then(function(response) {
|
|
407
|
+
//console.log("执行成功", response.data);
|
|
408
|
+
|
|
409
|
+
cb(response.data);
|
|
410
|
+
}).catch(function(error) {
|
|
411
|
+
console.log("执行失败:" + error);
|
|
412
|
+
cb(false, error);
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
_getMenus() {
|
|
417
|
+
if (!fs.existsSync(menuPath)) {
|
|
418
|
+
return [];
|
|
419
|
+
}
|
|
420
|
+
var json = fs.readFileSync(menuPath).toString();
|
|
421
|
+
return JSON.parse(json);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
_saveMenus(menus) {
|
|
425
|
+
if (!fs.existsSync(menuPath)) {
|
|
426
|
+
utils.mkdirsSync(menuPath);
|
|
427
|
+
}
|
|
428
|
+
fs.writeFileSync(menuPath, JSON.stringify(menus));
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
exports = module.exports = new homeai();
|
package/apis/menu.js
CHANGED
|
@@ -18,9 +18,7 @@ class menu {
|
|
|
18
18
|
var body = utils.getReqBody(req);
|
|
19
19
|
var menus = this._getMenus();
|
|
20
20
|
if (body.type != 'list') {
|
|
21
|
-
|
|
22
|
-
this._convertListToMenu(node, menus, 0);
|
|
23
|
-
menus = node;
|
|
21
|
+
menus = this._convertListToMenu(null, menus, 0);
|
|
24
22
|
}
|
|
25
23
|
|
|
26
24
|
crabatool.utils.end(res, {
|
|
@@ -46,19 +44,30 @@ class menu {
|
|
|
46
44
|
return item.pid == pid;
|
|
47
45
|
});
|
|
48
46
|
|
|
47
|
+
if (!node) {
|
|
48
|
+
node = { ChildNodes: [] };
|
|
49
|
+
}
|
|
50
|
+
|
|
49
51
|
var self = this;
|
|
50
52
|
items.forEach(function(rowData) {
|
|
51
53
|
var child = { ChildNodes: [] };
|
|
52
54
|
child.Text = rowData.text;
|
|
53
55
|
child.Icon = rowData.icon;
|
|
54
|
-
|
|
56
|
+
child.ShowPage = rowData.showPage;
|
|
57
|
+
if (rowData.onClick) {
|
|
58
|
+
child.OnClick = rowData.onClick;
|
|
59
|
+
}
|
|
55
60
|
child.CssClass = rowData.level == 1 ? 'MenuText' : rowData.cssClass;
|
|
56
61
|
child.BeginGroup = rowData.level == 1 ? true : false;
|
|
57
62
|
child.Param = { id: rowData.id };
|
|
63
|
+
if (rowData.param) {
|
|
64
|
+
Object.assign(child.Param, rowData.param);
|
|
65
|
+
}
|
|
58
66
|
node.ChildNodes.push(child);
|
|
59
67
|
|
|
60
68
|
self._convertListToMenu(child, list, rowData.id);
|
|
61
69
|
});
|
|
70
|
+
return node;
|
|
62
71
|
}
|
|
63
72
|
}
|
|
64
73
|
exports = module.exports = new menu();
|