crabatool 1.0.407 → 1.0.410

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 CHANGED
@@ -198,71 +198,104 @@ class data {
198
198
  var dataChange = this.pagesDataChanged[pageName]
199
199
 
200
200
  var cs = this.getDataChangeItem(dataChange);
201
- var map = this.findItemMapData(name, data, cs)
202
- var action = this.findActionByMatchCondition(map, dataChange)
203
- if (!action) {
201
+ var map = this.findItemMapData(name, name, data, cs)
202
+ var actions = this.findActionByMatchCondition(map, dataChange)
203
+ if (!actions || actions.length == 0) {
204
204
  return data;
205
205
  }
206
206
  //查找涉及的所有实体
207
207
  var _this = this;
208
- await action && action.forEach(async item => {
209
- if (item.type == 'external') {//外表处理
210
- await _this.externalDataLinkage(req, name, data, item, reverseNumber);
211
- } else {//内部处理
212
- //从原始数据中获取对应字段的数据
213
- var targetRef = _this.findFormateItem(item.filter.refField)
214
- var targetRefField = _this.findFormateItem(`#[${item.ref}.${item.field}]`)
215
- var targetValue = _this.findItemMapData(crabatool.stringUtils.getFullPinyinCode(item.ref), data, new Set([...targetRef, ...targetRefField]));
216
- var refFieldName = this.matchFields(item.filter.refField)[0];
217
- var refFieldNamePy = crabatool.stringUtils.getFullPinyinCode(refFieldName);
218
- var t = refFieldNamePy.split('.')
219
- var refData = _this.findLayerData(targetValue, t)
220
-
221
- var filterCs = _this.findFormateItem(item.filter.refValue)
222
- var tp = _this.findFormateItem(item.formate);
223
- var sourceValue = _this.findItemMapData(name, data, new Set([...filterCs, ...tp]), reverseNumber);
224
- var refValueName = this.matchFields(item.filter.refValue)[0];
225
- var refValueNamePy = crabatool.stringUtils.getFullPinyinCode(refValueName);
226
- var t = refValueNamePy.split('.')
227
- var sourceData = _this.findLayerData(sourceValue, t)
228
-
229
- //根据refData和sourceData计算结果
230
- var refNamePy = crabatool.stringUtils.getFullPinyinCode(item.ref);
231
- var fieldNamePy = crabatool.stringUtils.getFullPinyinCode(item.field);
232
- Object.keys(refData).forEach(key => {
233
- var target = refData[key][0];
234
- //目标值为单一对象
235
- if (!target[refNamePy]) {
236
- return;
208
+ for(var i = 0 ; i < actions.length; i++){
209
+ var action = actions[i];
210
+ for(var j = 0 ; j < action.length ; j++){
211
+ var item = action[j];
212
+ if (item.type == 'external') {//外表处理
213
+ await _this.externalDataLinkage(req, name, data, item, reverseNumber);
214
+ } else {//内部处理
215
+ //从原始数据中获取对应字段的数据
216
+ var targetRef = _this.findFormateItem(item.filter.refField)
217
+ var targetRefField = _this.findFormateItem(`#[${item.ref}.${item.field}]`)
218
+ var targetValue = _this.findItemMapData(name, crabatool.stringUtils.getFullPinyinCode(item.ref), data, new Set([...targetRef, ...targetRefField]));
219
+ var refFieldName = this.matchFields(item.filter.refField)[0];
220
+ var refFieldNamePy = crabatool.stringUtils.getFullPinyinCode(refFieldName);
221
+ var targetArray = refFieldNamePy.split('.')
222
+ var refData = _this.findLayerData(targetValue, targetArray)
223
+
224
+ var filterCs = _this.findFormateItem(item.filter.refValue)
225
+ var tp = _this.findFormateItem(item.formate);
226
+ var sourceValue = _this.findItemMapData(name, crabatool.stringUtils.getFullPinyinCode(item.ref), data, new Set([...filterCs, ...tp]), reverseNumber);
227
+ var refValueName = this.matchFields(item.filter.refValue)[0];
228
+ var refValueNamePy = crabatool.stringUtils.getFullPinyinCode(refValueName);
229
+ var t = refValueNamePy.split('.')
230
+ var sourceData = _this.findLayerData(sourceValue, t)
231
+
232
+ //根据refData和sourceData计算结果
233
+ var refNamePy = crabatool.stringUtils.getFullPinyinCode(item.ref);
234
+ var fieldNamePy = crabatool.stringUtils.getFullPinyinCode(item.field);
235
+ Object.keys(refData).forEach(key => {
236
+ var target = refData[key][0];
237
+ //目标值为单一对象
238
+ if (!target[refNamePy]) {
239
+ return;
240
+ }
241
+ if (oldData) {
242
+ if(name != refNamePy){
243
+ //传入了老数据,当前计算的值可以直接取老数据的对应值,因为它已经排除本单
244
+ var oldDataTemp = oldData[name][refNamePy];
245
+ if(oldDataTemp instanceof Array){
246
+ target[refNamePy][fieldNamePy] = oldDataTemp[0][fieldNamePy];//强制取第一行
247
+ } else {
248
+ target[refNamePy][fieldNamePy] = oldDataTemp[fieldNamePy] ? oldDataTemp[fieldNamePy] : 0;
249
+ }
250
+ } else {
251
+ //传入了老数据,当前计算的值可以直接取老数据的对应值,因为它已经排除本单
252
+ target[refNamePy][fieldNamePy] = oldData[refNamePy][fieldNamePy] ? oldData[refNamePy][fieldNamePy] : 0;
253
+ }
254
+ } else {
255
+ target[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy] ? target[refNamePy][fieldNamePy] : 0;
256
+ }
257
+ var tempSourceValue = sourceData[key];
258
+ var fieldData = 0;
259
+ for (var j = 0; j < tempSourceValue.length; j++) {
260
+ var value = tempSourceValue[j]
261
+ //还原结果数字,避免在公式中计算时带入右边公式,反复计算(如商品余量=商品余量+商品库存)
262
+ value[refNamePy] && (value[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy]);
263
+ fieldData += this.execFormate(item.formate, value, 0)
264
+ }
265
+ target[refNamePy][fieldNamePy] = fieldData;
266
+ });
267
+
268
+
269
+ //把计算结果赋值给原来的值,让带到后面去
270
+ var targetObj = data;
271
+ if (refNamePy != name) {
272
+ targetObj = data[refNamePy];
237
273
  }
238
- if (oldData) {
239
- //传入了老数据,当前计算的值可以直接取老数据的对应值,因为它已经排除本单
240
- target[refNamePy][fieldNamePy] = oldData[refNamePy][fieldNamePy] ? oldData[refNamePy][fieldNamePy] : 0;
274
+ if(targetObj instanceof Array){
275
+ targetObj.forEach(titem => {
276
+ var primaryKey = titem[targetArray[1]];
277
+ if(!refData[primaryKey]){//没找到对应行,直接返回
278
+ return;
279
+ }
280
+ var refDataTemp = refData[primaryKey][0][refNamePy];
281
+ Object.keys(refDataTemp).forEach(key => {
282
+ titem[key] = refDataTemp[key];
283
+ });
284
+ })
241
285
  } else {
242
- target[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy] ? target[refNamePy][fieldNamePy] : 0;
243
- }
244
- var tempSourceValue = sourceData[key];
245
- var fieldData = 0;
246
- for (var j = 0; j < tempSourceValue.length; j++) {
247
- var value = tempSourceValue[j]
248
- //还原结果数字,避免在公式中计算时带入右边公式,反复计算(如商品余量=商品余量+商品库存)
249
- value[refNamePy] && (value[refNamePy][fieldNamePy] = target[refNamePy][fieldNamePy]);
250
- fieldData += this.execFormate(item.formate, value, 0)
286
+ var targetObj = data;
287
+ if (refNamePy == name) {
288
+ targetObj = data;
289
+ }
290
+ //将结果赋值给实体对象
291
+ var t = targetValue[refNamePy];
292
+ Object.keys(t).forEach(key => {
293
+ targetObj[key] = t[key];
294
+ });
251
295
  }
252
- target[refNamePy][fieldNamePy] = fieldData;
253
- });
254
-
255
- var targetObj = data;
256
- if (crabatool.stringUtils.getFullPinyinCode(item.ref) == name) {
257
- targetObj = data;
258
296
  }
259
- //将结果赋值给实体对象
260
- var t = targetValue[crabatool.stringUtils.getFullPinyinCode(item.ref)];
261
- Object.keys(t).forEach(key => {
262
- targetObj[key] = t[key];
263
- });
264
297
  }
265
- })
298
+ }
266
299
 
267
300
  return data;
268
301
  }
@@ -275,7 +308,7 @@ class data {
275
308
  //获取本来数据源的数据
276
309
  var filterCs = _this.findFormateItem(item.filter.refValue)
277
310
  var tp = _this.findFormateItem(item.formate);
278
- var allValue = _this.findItemMapData(name, data, new Set([...filterCs, ...tp]), reverseNumber);
311
+ var allValue = _this.findItemMapData(name, name, data, new Set([...filterCs, ...tp]), reverseNumber);
279
312
  var filterValue = _this.findLayerData(allValue, crabatool.stringUtils.getFullPinyinCode(refValueFieldName).split('.'));
280
313
  //根据filterValue取外表数据
281
314
  var refPy = crabatool.stringUtils.getFullPinyinCode(item.ref)
@@ -283,14 +316,13 @@ class data {
283
316
  var size = 100;
284
317
  var rtSize = 0;
285
318
  var changeRefData = [];
319
+ var db = this._getDb(req);
286
320
  do {
287
321
  //循环取外表数据
288
322
  var page = 1;
289
- var t = await this._getDb(req).find(refPy, {
323
+ var t = await db.find(refPy, {
290
324
  page: page,
291
325
  pageSize: size,
292
-
293
-
294
326
  filterFunc: function (row) {
295
327
  if (filterValue[row[refFieldPy]]) {
296
328
  changeRefData.push({
@@ -360,12 +392,12 @@ class data {
360
392
  }
361
393
 
362
394
  //查找项的映射链路数据值
363
- findItemMapData(name, data, cs, reverseNumber) {
395
+ findItemMapData(name, itemName, data, cs, reverseNumber) {
364
396
  //合并相同数据,只考虑2层
365
397
  var rowMap = {};
366
398
  cs.forEach(item => {
367
399
  var arrays = item.split('.');
368
- var pre = name;
400
+ var pre = itemName;
369
401
  var field = "";
370
402
  if (arrays.length == 2) {
371
403
  pre = arrays[0];
@@ -417,13 +449,12 @@ class data {
417
449
  //根据条件查找匹配的action
418
450
  findActionByMatchCondition(map, dataChange) {
419
451
  //对比条件,找到满足的条件的动作
420
- var action = null;
452
+ var action = [];
421
453
  for (var i = 0; i < dataChange.length; i++) {
422
454
  var item = dataChange[i];
423
455
  if (this.execFormate(item.condition, map)) {
424
456
  //找到满足的条件
425
- action = item.action;
426
- break;
457
+ action.push(item.action);
427
458
  }
428
459
  }
429
460
  return action;
package/index.js CHANGED
@@ -173,7 +173,7 @@ function checkFast(args) {
173
173
  if (args.includes('-pageHash')) {
174
174
  start.bindAndCheckConfig('-pageHash');
175
175
  start.bindConfigByArgv('-ngp', 'boolean');
176
- require('./tool/pageHash.js').start(); // wps安全改造,工具生成js和css的hash
176
+ require('./tool/pageHash.js').start(); // 手动生成页面的hash,用于配置id
177
177
  return false;
178
178
  }
179
179
 
package/lib/utils.js CHANGED
@@ -229,7 +229,7 @@ class Utils {
229
229
  }
230
230
 
231
231
  getQueryValue(req, key) {
232
- var query = req.parsed.query;
232
+ var query = req.query;
233
233
  if (!query) return null;
234
234
  if (query[key] == undefined) return null;
235
235
  return unescape(query[key]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crabatool",
3
- "version": "1.0.407",
3
+ "version": "1.0.410",
4
4
  "description": "crabatool",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -27,7 +27,8 @@
27
27
  "makeHash": "node run.js -makeHash -webPath ./test/ -modName craba -files http://crabadoc.ca.com/js/utils/utils.js,F:/newcrabadoc/www/js/utils/utils.js,./test/test.js,./test/beefun.js,https://s5.vip.wpscdn.cn/web-libs/2t/js/userinfo-collect/1.0.3/vas2t-userinfo-collect.min.js?a=1 -outJson ./hash.json -hashName sha384",
28
28
  "makeHash2": "node run.js -makeHash -webPath ./test/ -modName craba -files ./test/ -exts .js -outJson ./hash2.json -hashName sha384",
29
29
  "pageHash": "node run.js -pageHash /Test/TestMasterDetail.gspx",
30
- "addVersion":"node run.js -addVersion -file F:\\basicweb\\www\\index.html -exp AUTOVERSION"
30
+ "addVersion": "node run.js -addVersion -file F:\\basicweb\\www\\index.html -exp AUTOVERSION",
31
+ "gspxHash": "node run.js -gspxHash -webPath F:\\Beefun\\srcs\\Beefun"
31
32
  },
32
33
  "author": "wssf",
33
34
  "dependencies": {
@@ -69,4 +70,4 @@
69
70
  "crabatool"
70
71
  ],
71
72
  "license": "UNLICENSED"
72
- }
73
+ }
@@ -0,0 +1,90 @@
1
+
2
+ var config = require('../lib/config.js');
3
+ var path = require('path');
4
+ var fs = require('fs');
5
+ var utils = require('../lib/utils.js');
6
+ var os = require('os');
7
+ const crypto = require('crypto');
8
+ var requestSync = require('sync-request');
9
+
10
+
11
+ module.exports.start = function() {
12
+ if (!config.hashName) {
13
+ config.hashName = 'sha384';
14
+ }
15
+
16
+ if (!config.files) {
17
+ config.files = [];
18
+ }
19
+
20
+ var results = {};
21
+ buildFiles(results, config.files);
22
+
23
+ utils.mkdirsSync(config.outJson);
24
+ fs.writeFileSync(config.outJson, JSON.stringify(results));
25
+ }
26
+
27
+ function buildFiles(results, files) {
28
+ files.forEach(function(f) {
29
+ console.log(f);
30
+
31
+ var content;
32
+ var isHttp = f.startsWith('http');
33
+ if (isHttp) {
34
+ var res = requestSync("GET", f);
35
+ content = res.getBody();
36
+ } else if (fs.existsSync(f)) {
37
+
38
+ // 磁盘目录
39
+ var statFs = fs.statSync(f);
40
+ if (!statFs.isFile()) {
41
+ var files2 = fs.readdirSync(f);
42
+ files2 = files2.map(function(s) {
43
+ return utils.join(f, s);
44
+ });
45
+ buildFiles(results, files2);
46
+ return;
47
+ }
48
+
49
+ if (config.exts && config.exts.length > 0) {
50
+ var ext = path.extname(f).toLowerCase();
51
+ if (!config.exts.includes(ext)) {
52
+ return;
53
+ }
54
+ }
55
+
56
+ content = fs.readFileSync(f);
57
+ } else {
58
+ console.error('文件不存在:' + f);
59
+ return;
60
+ }
61
+
62
+ var index = f.indexOf('?');
63
+ if (index > 0) {
64
+ f = f.substr(0, index);
65
+ }
66
+
67
+ // 转为相对webPath的路径
68
+ if (!isHttp) {
69
+ f = path.resolve(f);
70
+ var webPath = path.resolve(config.webPath);
71
+ f = f.replace(webPath, '');
72
+ if (config.modName) {
73
+ f = path.join(config.modName, f);
74
+ }
75
+ f = f.replace(/\\/g, '/');
76
+ }
77
+
78
+ // SRI Hash Generator
79
+ // https://www.srihash.org/
80
+
81
+ var base64 = makeHash(content, config.hashName); // 将文件内容进行hash计算
82
+ results[f] = config.hashName + '-' + base64; // 使用 base64 编码 sha384 算法计算出摘要后的 integrity 值的示例
83
+ });
84
+ }
85
+
86
+ function makeHash(str, name) {
87
+ const hash = crypto.createHash(name);
88
+ hash.update(str);
89
+ return hash.digest('base64');
90
+ }