eoss 0.1.0-alpha.38 → 0.1.0-alpha.39

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.
Files changed (59) hide show
  1. package/lib/account-login.js +3729 -3725
  2. package/lib/ca-login.js +18 -8
  3. package/lib/checkbox-group.js +4329 -4329
  4. package/lib/data-table.js +3582 -3584
  5. package/lib/email-login.js +3525 -3522
  6. package/lib/eoss.common.js +426 -337
  7. package/lib/flow.js +27361 -27357
  8. package/lib/flows.js +5612 -5612
  9. package/lib/form.js +8 -8
  10. package/lib/index.js +1 -1
  11. package/lib/login.js +5982 -5978
  12. package/lib/lowcode-view.js +5263 -5258
  13. package/lib/lowcode.js +16885 -16884
  14. package/lib/main.js +99 -58
  15. package/lib/phone-login.js +3542 -3538
  16. package/lib/process-config.js +4105 -4080
  17. package/lib/process-module.js +3555 -3541
  18. package/lib/process-rule.js +4707 -4688
  19. package/lib/qrcode-login.js +3290 -3290
  20. package/lib/radio-group.js +3466 -3466
  21. package/lib/retrial-auth.js +3516 -3516
  22. package/lib/select.js +9354 -9354
  23. package/lib/selector-panel.js +6280 -6280
  24. package/lib/selector.js +5320 -5320
  25. package/lib/table.js +16094 -16094
  26. package/lib/tips.js +3309 -3309
  27. package/lib/tree.js +6666 -6661
  28. package/lib/upload.js +7994 -7989
  29. package/lib/wujie.js +9 -3
  30. package/package.json +1 -1
  31. package/packages/account-login/src/account-login.vue +9 -15
  32. package/packages/ca-login/src/ca-login.vue +5 -6
  33. package/packages/data-table/src/data-table.vue +1 -3
  34. package/packages/email-login/src/email-login.vue +10 -11
  35. package/packages/flow/src/form.vue +2 -2
  36. package/packages/login/src/download.vue +2 -2
  37. package/packages/login/src/login.vue +3 -4
  38. package/packages/login/src/resetPassword.vue +3 -3
  39. package/packages/lowcode/src/attribute.vue +10 -9
  40. package/packages/lowcode-view/src/view.vue +3 -2
  41. package/packages/main/src/components/message.vue +7 -7
  42. package/packages/main/src/components/notice.vue +3 -2
  43. package/packages/main/src/components/pages.vue +28 -2
  44. package/packages/main/src/components/router-page.vue +6 -1
  45. package/packages/main/src/minxs.js +14 -10
  46. package/packages/phone-login/src/phone-login.vue +4 -4
  47. package/packages/process-config/src/FormList.vue +14 -8
  48. package/packages/process-config/src/NodeConfig.vue +50 -37
  49. package/packages/process-config/src/NodeForm.vue +37 -32
  50. package/packages/process-config/src/main.vue +50 -37
  51. package/packages/process-module/src/FormList.vue +16 -11
  52. package/packages/process-module/src/main.vue +52 -39
  53. package/packages/process-rule/src/FormList.vue +120 -105
  54. package/packages/process-rule/src/companyReportDetail.vue +13 -8
  55. package/packages/process-rule/src/main.vue +71 -52
  56. package/packages/tree/src/tree.vue +6 -5
  57. package/packages/upload/src/index.vue +3 -2
  58. package/packages/wujie/src/wujie.vue +7 -1
  59. package/src/index.js +1 -1
package/lib/wujie.js CHANGED
@@ -3549,7 +3549,7 @@ __webpack_require__.d(__webpack_exports__, "preloadApp", function() { return /*
3549
3549
  __webpack_require__.d(__webpack_exports__, "destroyApp", function() { return /* reexport */ destroyApp; });
3550
3550
  __webpack_require__.d(__webpack_exports__, "refreshApp", function() { return /* reexport */ refreshApp; });
3551
3551
 
3552
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/wujie/src/wujie.vue?vue&type=template&id=3fa66ad9&
3552
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/wujie/src/wujie.vue?vue&type=template&id=416c748e&
3553
3553
  var render = function () {
3554
3554
  var _vm = this
3555
3555
  var _h = _vm.$createElement
@@ -3601,7 +3601,7 @@ var staticRenderFns = []
3601
3601
  render._withStripped = true
3602
3602
 
3603
3603
 
3604
- // CONCATENATED MODULE: ./packages/wujie/src/wujie.vue?vue&type=template&id=3fa66ad9&
3604
+ // CONCATENATED MODULE: ./packages/wujie/src/wujie.vue?vue&type=template&id=416c748e&
3605
3605
 
3606
3606
  // EXTERNAL MODULE: external "vue"
3607
3607
  var external_vue_ = __webpack_require__(2);
@@ -3769,7 +3769,9 @@ var bus = external_wujie_vue2_default.a.bus,
3769
3769
 
3770
3770
  watch: {
3771
3771
  /**
3772
- * 监听 keys 变化,重建子应用实现刷新
3772
+ * 监听 keys 变化,重建子应用实现刷新(点菜单/刷新按钮的统一通道);
3773
+ * url 变化不单独触发重建:换地址场景(如 fourthTabs)由调用方同时更新 keys,
3774
+ * 避免 url+keys 同变时重建两次
3773
3775
  */
3774
3776
  keys: function keys() {
3775
3777
  this.refresh();
@@ -3782,6 +3784,10 @@ var bus = external_wujie_vue2_default.a.bus,
3782
3784
  bus.$off(this.name);
3783
3785
  }
3784
3786
  this._clearTimer();
3787
+ // 保活模式下沙箱不随组件卸载回收,页签关闭时主动销毁,避免沙箱常驻内存
3788
+ if (this.alive) {
3789
+ this.destroy();
3790
+ }
3785
3791
  },
3786
3792
 
3787
3793
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eoss",
3
- "version": "0.1.0-alpha.38",
3
+ "version": "0.1.0-alpha.39",
4
4
  "description": "eoss内部业务组件",
5
5
  "main": "lib/eoss.common.js",
6
6
  "files": [
@@ -104,13 +104,7 @@
104
104
  </template>
105
105
 
106
106
  <script>
107
- import {
108
- queryParams,
109
- encode,
110
- decode,
111
- loading,
112
- error
113
- } from 'eoss/src/utils/util';
107
+ import { queryParams, encode, decode, loading } from 'eoss/src/utils/util';
114
108
  import { getStorage } from 'eoss/src/utils/storage';
115
109
  import { changeImg } from 'eoss/src/config/api';
116
110
  import { ajax } from 'eoss/src/utils/ajax';
@@ -119,6 +113,8 @@ import EsCheckbox from 'eoss/packages/checkbox';
119
113
  import EsForm from 'eoss/packages/form';
120
114
  import EsFormItem from 'eoss/packages/form-item';
121
115
  import EsInput from 'eoss/packages/input';
116
+ import Message from 'eoss/packages/message';
117
+
122
118
  export default {
123
119
  name: 'EsAccountLogin',
124
120
  components: { EsButton, EsCheckbox, EsForm, EsFormItem, EsInput },
@@ -385,10 +381,9 @@ export default {
385
381
  if (rCode === 0) {
386
382
  const { statusCode, msg } = results;
387
383
  if (statusCode === 1) {
388
- error(msg || '登录失败!', () => {
389
- this.$emit('error', res);
390
- this.resetCode();
391
- });
384
+ Message.error(msg || '登录失败!');
385
+ this.$emit('error', res);
386
+ this.resetCode();
392
387
  } else {
393
388
  if (this.checked) {
394
389
  this.$set(
@@ -404,10 +399,9 @@ export default {
404
399
  this.$emit('success', results);
405
400
  }
406
401
  } else {
407
- error(res.msg || '登录失败!', () => {
408
- this.$emit('error', res);
409
- this.resetCode();
410
- });
402
+ Message.error(res.msg || '登录失败!');
403
+ this.$emit('error', res);
404
+ this.resetCode();
411
405
  }
412
406
  loadingInstance.close();
413
407
  })
@@ -24,6 +24,7 @@
24
24
 
25
25
  <script>
26
26
  import MessageBox from 'eoss/packages/message-box';
27
+ import Message from 'eoss/packages/message';
27
28
  import EsButton from 'eoss/packages/button';
28
29
  import {
29
30
  uuid,
@@ -493,18 +494,16 @@ export default {
493
494
  if (res.rCode == 0) {
494
495
  const { statusCode, msg } = results;
495
496
  if (statusCode === 1) {
496
- error(msg || '登录失败!', () => {
497
- this.$emit('error', res);
498
- });
497
+ Message.error(msg || '登录失败!');
498
+ this.$emit('error', res);
499
499
  } else {
500
500
  this.$emit('success', results);
501
501
  }
502
502
  } else {
503
503
  const msg =
504
504
  res.results && res.results.msg ? res.results.msg : res.msg;
505
- error(msg || '系统错误,请联系管理员!', () => {
506
- this.$emit('error', res);
507
- });
505
+ Message.error(msg || '系统错误,请联系管理员!');
506
+ this.$emit('error', res);
508
507
  }
509
508
  loadingInstance.close();
510
509
  })
@@ -312,9 +312,7 @@ export default {
312
312
  this.$set(this.pages, 'total', results.totalCount);
313
313
  this.datas = results.records || results.data || [];
314
314
  })
315
- .catch((res) => {
316
- error(res.message || '数据获取失败');
317
- });
315
+ .catch(() => {});
318
316
  }
319
317
  return this.datas;
320
318
  },
@@ -66,12 +66,13 @@
66
66
  <script>
67
67
  import { getLoginCode } from 'eoss/src/config/api';
68
68
  import { ajax } from 'eoss/src/utils/ajax';
69
- import { success, error, loading } from 'eoss/src/utils/util';
69
+ import { loading } from 'eoss/src/utils/util';
70
70
 
71
71
  import EsButton from 'eoss/packages/button';
72
72
  import EsForm from 'eoss/packages/form';
73
73
  import EsFormItem from 'eoss/packages/form-item';
74
74
  import EsInput from 'eoss/packages/input';
75
+ import Message from 'eoss/packages/message';
75
76
  /**
76
77
  * 邮箱验证码登录组件
77
78
  * 功能说明:提供邮箱验证码登录功能,包括邮箱输入、验证码获取和登录提交
@@ -221,9 +222,9 @@ export default {
221
222
  .then((res) => {
222
223
  const { rCode, msg } = res;
223
224
  if (rCode === 0) {
224
- this.$message.success(msg || '验证码已发送!');
225
+ Message.success(msg || '验证码已发送!');
225
226
  } else {
226
- this.$message({
227
+ Message({
227
228
  message: res.msg || '验证码获取失败!',
228
229
  type: 'error',
229
230
  onClose: () => {
@@ -273,18 +274,16 @@ export default {
273
274
  if (rCode === 0) {
274
275
  const { statusCode, msg } = results;
275
276
  if (statusCode === 1) {
276
- error(msg || '登录失败!', () => {
277
- this.$emit('error', res);
278
- this.resetCode();
279
- });
277
+ Message.error(msg || '登录失败!');
278
+ this.$emit('error', res);
279
+ this.resetCode();
280
280
  } else {
281
281
  this.$emit('success', results);
282
282
  }
283
283
  } else {
284
- error(res.msg || '登录失败!', () => {
285
- this.$emit('error', res);
286
- this.resetCode();
287
- });
284
+ Message.error(res.msg || '登录失败!');
285
+ this.$emit('error', res);
286
+ this.resetCode();
288
287
  }
289
288
  })
290
289
  .catch(() => {
@@ -48,11 +48,11 @@
48
48
  <script>
49
49
  import { addCommonOpion, editCommonOpion } from 'eoss/src/config/api';
50
50
  import { ajax } from 'eoss/src/utils/ajax';
51
- import { error } from 'eoss/src/utils/util';
52
51
  import EsButton from 'eoss/packages/button';
53
52
  import EsForm from 'eoss/packages/form';
54
53
  import EsFormItem from 'eoss/packages/form-item';
55
54
  import EsInput from 'eoss/packages/input';
55
+ import Message from 'eoss/packages/message';
56
56
  export default {
57
57
  name: 'ideas',
58
58
  componentName: 'ideas',
@@ -111,7 +111,7 @@ export default {
111
111
  if (status == 'success') {
112
112
  this.newData = data.bean;
113
113
  } else {
114
- error(message || '系统错误,请联系管理员!');
114
+ Message.error(message || '系统错误,请联系管理员!');
115
115
  }
116
116
  this.loading = false;
117
117
  })
@@ -28,7 +28,7 @@
28
28
  </div>
29
29
  </template>
30
30
  <script>
31
- import { error } from 'eoss/src/utils/util';
31
+ import Message from 'eoss/packages/message';
32
32
  import EsIcon from 'eoss/packages/icon';
33
33
  import EsQrCode from 'eoss/packages/qr-code';
34
34
  export default {
@@ -75,7 +75,7 @@ export default {
75
75
  if (url) {
76
76
  window.open(url);
77
77
  } else {
78
- error('下载地址不存在!');
78
+ Message.error('下载地址不存在!');
79
79
  return;
80
80
  }
81
81
  }
@@ -227,9 +227,7 @@ import {
227
227
  setFavicon,
228
228
  delUrlParam,
229
229
  urlJoinParams,
230
- success,
231
- warning,
232
- error
230
+ warning
233
231
  } from 'eoss/src/utils/util';
234
232
  import { isObject } from 'eoss/src/utils/types';
235
233
  import { ajax } from 'eoss/src/utils/ajax';
@@ -246,6 +244,7 @@ import {
246
244
  getTwoFactorLoginCode,
247
245
  doAssistanceQrLogin
248
246
  } from 'eoss/src/config/api';
247
+ import Message from 'eoss/packages/message';
249
248
  const DEFAULT_SIZE = {
250
249
  xxl: 'large',
251
250
  xl: undefined,
@@ -678,7 +677,7 @@ export default {
678
677
  this.setConfig(res.results);
679
678
  this.$emit('initLogin', res.results);
680
679
  } else {
681
- error(res.msg || '系统错误,请联系管理员!');
680
+ Message.error(res.msg || '系统错误,请联系管理员!');
682
681
  }
683
682
  })
684
683
  .catch((err) => {});
@@ -47,7 +47,7 @@ import {
47
47
  import { encryptFormData } from 'eoss/src/utils/helpers';
48
48
  import rules from 'eoss/src/utils/rules.js';
49
49
  import { ajax } from 'eoss/src/utils/ajax';
50
- import { error, success } from 'eoss/src/utils/util';
50
+ import Message from 'eoss/packages/message';
51
51
  import EsForm from 'eoss/packages/form';
52
52
  import EsMenu from 'eoss/packages/menu';
53
53
  import EsMenuItem from 'eoss/packages/menu-item';
@@ -411,7 +411,7 @@ export default {
411
411
  }
412
412
  } else {
413
413
  let msg = res.msg || '系统错误,请联系管理员!';
414
- error(msg);
414
+ Message.error(msg);
415
415
  }
416
416
  })
417
417
  .catch((err) => {});
@@ -479,7 +479,7 @@ export default {
479
479
  },
480
480
  handleSubmit() {
481
481
  this.submit = true;
482
- let { repassword, ...data } = this.formData;;
482
+ let { repassword, ...data } = this.formData;
483
483
  debugger;
484
484
  // 使用工具函数加密数据
485
485
  data = encryptFormData(data, this.secret, this.isEncrypt);
@@ -67,6 +67,7 @@ import { parseTemplateNodes } from './util/source-parser';
67
67
  import EsDialog from 'eoss/packages/dialog';
68
68
  import EsTabPane from 'eoss/packages/tab-pane';
69
69
  import EsTabs from 'eoss/packages/tabs';
70
+ import Message from 'eoss/packages/message';
70
71
  // 原生 HTML 元素标签名集合
71
72
  const NATIVE_HTML_TAGS = new Set([
72
73
  'a',
@@ -516,7 +517,7 @@ export default {
516
517
  try {
517
518
  updates[name] = JSON.parse(value);
518
519
  } catch (e) {
519
- this.$message.error('JSON 格式错误,请检查');
520
+ Message.error('JSON 格式错误,请检查');
520
521
  return;
521
522
  }
522
523
  } else {
@@ -596,7 +597,7 @@ export default {
596
597
  // 提取 <script> 标签中的内容
597
598
  const scriptMatch = source.match(/<script[^>]*>([\s\S]*?)<\/script>/);
598
599
  if (!scriptMatch) {
599
- this.$message.error('脚本格式错误,缺少 <script> 标签');
600
+ Message.error('脚本格式错误,缺少 <script> 标签');
600
601
  return null;
601
602
  }
602
603
 
@@ -607,7 +608,7 @@ export default {
607
608
  /export\s+default\s*\{([\s\S]*)\}/
608
609
  );
609
610
  if (!exportMatch) {
610
- this.$message.error('脚本格式错误,缺少 export default');
611
+ Message.error('脚本格式错误,缺少 export default');
611
612
  return null;
612
613
  }
613
614
 
@@ -670,7 +671,7 @@ export default {
670
671
  try {
671
672
  result.props = new Function(`return ${propsStr}`)();
672
673
  } catch (e2) {
673
- this.$message.error('props 格式错误');
674
+ Message.error('props 格式错误');
674
675
  return null;
675
676
  }
676
677
  }
@@ -708,7 +709,7 @@ export default {
708
709
  try {
709
710
  result.data = new Function(`return ${dataStr}`)();
710
711
  } catch (e2) {
711
- this.$message.error('data 格式错误');
712
+ Message.error('data 格式错误');
712
713
  return null;
713
714
  }
714
715
  }
@@ -725,7 +726,7 @@ export default {
725
726
  try {
726
727
  result.computed = new Function(`return ${computedStr}`)();
727
728
  } catch (e) {
728
- this.$message.error('computed 格式错误');
729
+ Message.error('computed 格式错误');
729
730
  return null;
730
731
  }
731
732
  // 保存原始文本用于回显
@@ -738,7 +739,7 @@ export default {
738
739
  try {
739
740
  result.watch = new Function(`return ${watchStr}`)();
740
741
  } catch (e) {
741
- this.$message.error('watch 格式错误');
742
+ Message.error('watch 格式错误');
742
743
  return null;
743
744
  }
744
745
  // 保存原始文本用于回显
@@ -751,7 +752,7 @@ export default {
751
752
  try {
752
753
  result.methods = new Function(`return ${methodsStr}`)();
753
754
  } catch (e) {
754
- this.$message.error('methods 格式错误');
755
+ Message.error('methods 格式错误');
755
756
  return null;
756
757
  }
757
758
  // 保存原始文本用于回显
@@ -877,7 +878,7 @@ export default {
877
878
 
878
879
  return result;
879
880
  } catch (e) {
880
- this.$message.error('脚本解析失败:' + e.message);
881
+ Message.error('脚本解析失败:' + e.message);
881
882
  return null;
882
883
  }
883
884
  }
@@ -113,6 +113,7 @@ import EsDialog from 'eoss/packages/dialog';
113
113
  import EsIcon from 'eoss/packages/icon';
114
114
  import EsScrollbar from 'eoss/packages/scrollbar';
115
115
  import { getStorage } from 'eoss/src/utils/storage';
116
+ import Message from 'eoss/packages/message';
116
117
  // 编辑态下布局末尾预留的投放区域高度:masonry 计入容器高度,流式布局用 padding-bottom
117
118
  const DROP_SPACE = 200;
118
119
  export default {
@@ -444,7 +445,7 @@ export default {
444
445
  })
445
446
  .then((res) => {
446
447
  if (res.rCode == 0 || res.status == 'success') {
447
- this.$message.success('保存成功!');
448
+ Message.success('保存成功!');
448
449
  // 保存成功后重新拉取页面配置,刷新渲染数据
449
450
  this.getPagesMap();
450
451
  this.edit = false;
@@ -454,7 +455,7 @@ export default {
454
455
  }
455
456
  })
456
457
  .catch((err) => {
457
- this.$message.error('系统错误!');
458
+ Message.error('系统错误!');
458
459
  })
459
460
  .finally(() => {
460
461
  loadingInstance.close();
@@ -79,12 +79,13 @@ import {
79
79
  ignoreSysMsg,
80
80
  ignoreAllSysMsg
81
81
  } from 'eoss/src/config/api.js';
82
- import { busEmit, error } from 'eoss/src/utils/util';
82
+ import { busEmit } from 'eoss/src/utils/util';
83
83
  import { ajax } from 'eoss/src/utils/ajax';
84
84
  import { getStorage } from 'eoss/src/utils/storage';
85
85
  import EsDialog from 'eoss/packages/dialog';
86
86
  import EsDrawer from 'eoss/packages/drawer';
87
87
  import EsScrollbar from 'eoss/packages/scrollbar';
88
+ import Message from 'eoss/packages/message';
88
89
  export default {
89
90
  name: 'Message',
90
91
  provide() {
@@ -207,7 +208,7 @@ export default {
207
208
  } else {
208
209
  this.loading = false;
209
210
  const msg = res.msg || '系统错误,请联系管理员!';
210
- error(msg);
211
+ Message.error(msg);
211
212
  }
212
213
  })
213
214
  .catch(() => {
@@ -233,7 +234,7 @@ export default {
233
234
  this.msgs.splice(index, 1);
234
235
  } else {
235
236
  const msg = res.msg || '系统错误,请联系管理员!';
236
- error(msg);
237
+ Message.error(msg);
237
238
  }
238
239
  });
239
240
  },
@@ -317,7 +318,7 @@ export default {
317
318
  const safeUrl = this.validateUrl(timestampUrl);
318
319
 
319
320
  if (!safeUrl) {
320
- error('无效的URL地址');
321
+ Message.error('无效的URL地址');
321
322
  return;
322
323
  }
323
324
 
@@ -346,7 +347,7 @@ export default {
346
347
  const safeUrl = this.validateUrl(item.timestampUrl);
347
348
 
348
349
  if (!safeUrl) {
349
- error('无效的URL地址');
350
+ Message.error('无效的URL地址');
350
351
  return;
351
352
  }
352
353
 
@@ -370,8 +371,7 @@ export default {
370
371
  this.windowIntervals.push(timer);
371
372
  }
372
373
  } catch (e) {
373
- console.error('窗口打开失败:', e);
374
- error('窗口打开失败');
374
+ Message.error('窗口打开失败');
375
375
  }
376
376
  } else {
377
377
  this.dialog = {
@@ -62,11 +62,12 @@
62
62
  </template>
63
63
  <script>
64
64
  import { ignoreSysMsg, ignoreAllSysMsg } from 'eoss/src/config/api.js';
65
- import { busEmit, error } from 'eoss/src/utils/util';
65
+ import { busEmit } from 'eoss/src/utils/util';
66
66
  import { ajax } from 'eoss/src/utils/ajax';
67
67
  import { getStorage } from 'eoss/src/utils/storage';
68
68
  import EsDialog from 'eoss/packages/dialog';
69
69
  import EsScrollbar from 'eoss/packages/scrollbar';
70
+ import Message from 'eoss/packages/message';
70
71
  export default {
71
72
  name: 'Notice',
72
73
  provide() {
@@ -135,7 +136,7 @@ export default {
135
136
  this.msgs.splice(i, 1);
136
137
  } else {
137
138
  let msg = res.msg || '系统错误,请联系管理员!';
138
- error(msg);
139
+ Message.error(msg);
139
140
  }
140
141
  });
141
142
  },
@@ -100,10 +100,11 @@
100
100
  ></router-page>
101
101
  <wujie
102
102
  v-else-if="item.method === 'wujie'"
103
- :name="item.appCode || item.code || item.id"
103
+ :name="wujieName(item)"
104
104
  :host="host"
105
105
  :url="item.url"
106
106
  :keys="item.keys"
107
+ alive
107
108
  @load-error="handleWujieLoadError(item)"
108
109
  ></wujie>
109
110
  <iframe
@@ -302,6 +303,14 @@ export default {
302
303
  return url;
303
304
  },
304
305
 
306
+ /**
307
+ * @desc:wujie 沙箱名按页签唯一,避免同一子应用多个菜单共用 name 时
308
+ * 互相 destroy/recreate 沙箱导致子应用重复启动
309
+ **/
310
+ wujieName(item) {
311
+ return `${item.appCode || item.code || item.id}__${item.id}`;
312
+ },
313
+
305
314
  handleSelect(res, index) {
306
315
  const { node } = res;
307
316
  if (node.urlopenmode === 1 || node.openModel === 1) {
@@ -313,7 +322,15 @@ export default {
313
322
  }
314
323
 
315
324
  const updatedTabs = [...this.newTabs];
316
- updatedTabs[index].url = node.url;
325
+ const tab = updatedTabs[index];
326
+ if (tab.method === 'iframe') {
327
+ // iframe 走 url 变化刷新:加时间戳保证重复点击同一菜单也会重载
328
+ tab.url = timestampUrl(node.url);
329
+ } else {
330
+ // router/wujie 走 keys 变化刷新(url 单独变化不触发重建)
331
+ tab.url = node.url;
332
+ this.$set(tab, 'keys', uuid());
333
+ }
317
334
  this.$main.tabs = updatedTabs;
318
335
  },
319
336
  /**
@@ -408,10 +425,19 @@ export default {
408
425
  },
409
426
  /**
410
427
  * @desc:wujie 加载失败,降级为 iframe 加载(重定向/登录跳转等服务端页面无法被 wujie 的 fetch 加载)
428
+ * 降级结果必须写回 $main.tabs 源页签对象:isFourthTabs 下 newTabs 是副本,
429
+ * 只改副本会在下次 tabs 同步时回滚成 wujie,造成 wujie/iframe 反复重建(页面加载两次)
411
430
  **/
412
431
  handleWujieLoadError(item) {
432
+ if (item.method === 'iframe') {
433
+ return;
434
+ }
413
435
  this.$set(item, 'loading', true);
414
436
  this.$set(item, 'method', 'iframe');
437
+ const source = (this.$main.tabs || []).find((t) => t.id === item.id);
438
+ if (source && source !== item) {
439
+ this.$set(source, 'method', 'iframe');
440
+ }
415
441
  },
416
442
  /**
417
443
  * @desc:刷新iframe
@@ -54,8 +54,13 @@ export default {
54
54
  },
55
55
 
56
56
  computed: {
57
+ /**
58
+ * 组件 key 只由 appCode/path + refreshTrigger 组成,不包含 keys:
59
+ * keys 变化已由 watcher 走 doRefresh() 重建一次,
60
+ * 若再拼进 key 会导致同一次 keys 变化重建两次(页面加载两次)
61
+ */
57
62
  componentKey() {
58
- return (this.keys || this.appCode) + (this.refreshTrigger ? '_r' : '');
63
+ return (this.appCode || this.path) + (this.refreshTrigger ? '_r' : '');
59
64
  }
60
65
  },
61
66
 
@@ -1391,13 +1391,13 @@ export default {
1391
1391
  this.setTips(this.business);
1392
1392
  this.setTips(this.systems);
1393
1393
  } else {
1394
- this.$message.error('未分配应用菜单权限,请联系管理员!');
1394
+ Message.error('未分配应用菜单权限,请联系管理员!');
1395
1395
  }
1396
1396
  this.getMenus(loadingInstance);
1397
1397
  } else {
1398
1398
  loadingInstance.close();
1399
1399
  let msg = res.msg || '系统错误,请联系管理员!';
1400
- this.$message.error(msg);
1400
+ Message.error(msg);
1401
1401
  }
1402
1402
  })
1403
1403
  .catch(() => {
@@ -1423,11 +1423,11 @@ export default {
1423
1423
  this.menus = res.results;
1424
1424
  this.renderMenus(this.menus);
1425
1425
  } else {
1426
- this.$message.error('未分配菜单权限,请联系管理员!');
1426
+ Message.error('未分配菜单权限,请联系管理员!');
1427
1427
  }
1428
1428
  } else {
1429
1429
  let msg = res.msg || '系统错误,请联系管理员!';
1430
- this.$message.error(msg);
1430
+ Message.error(msg);
1431
1431
  }
1432
1432
  })
1433
1433
  .catch(() => {
@@ -1479,11 +1479,11 @@ export default {
1479
1479
  }
1480
1480
  } else {
1481
1481
  let msg = res.msg || '系统错误,请联系管理员!';
1482
- this.$message.error(msg);
1482
+ Message.error(msg);
1483
1483
  }
1484
1484
  })
1485
1485
  .catch(() => {
1486
- this.$message.error('系统错误,请联系管理员!');
1486
+ Message.error('系统错误,请联系管理员!');
1487
1487
  });
1488
1488
  },
1489
1489
  /**
@@ -1585,7 +1585,7 @@ export default {
1585
1585
  } else {
1586
1586
  this.subMenus = null;
1587
1587
  this.showMenu = false;
1588
- this.$message.error('未分配菜单权限,请联系管理员!');
1588
+ Message.error('未分配菜单权限,请联系管理员!');
1589
1589
  }
1590
1590
  } else {
1591
1591
  let subMenus = this.getMenu(this.menus, this.appCode, 'appCode');
@@ -1609,7 +1609,7 @@ export default {
1609
1609
  } else {
1610
1610
  this.subMenus = null;
1611
1611
  this.showMenu = false;
1612
- this.$message.error('未分配菜单权限,请联系管理员!');
1612
+ Message.error('未分配菜单权限,请联系管理员!');
1613
1613
  }
1614
1614
  }
1615
1615
  } else if (
@@ -2274,7 +2274,11 @@ export default {
2274
2274
  if (tabs[i].method === 'iframe') {
2275
2275
  this.$set(this.tabs[i], 'url', timestampUrl(this.tabs[i].url));
2276
2276
  }
2277
- if (this.tabs[i].method === 'router') {
2277
+ // router/wujie 统一走 keys 变化触发刷新(点菜单=刷新一次)
2278
+ if (
2279
+ this.tabs[i].method === 'router' ||
2280
+ this.tabs[i].method === 'wujie'
2281
+ ) {
2278
2282
  this.$set(this.tabs[i], 'keys', uuid());
2279
2283
  }
2280
2284
  this.activeName = res.id;
@@ -2660,7 +2664,7 @@ export default {
2660
2664
  }
2661
2665
  }
2662
2666
  } else {
2663
- this.$message.error('没有此菜单!');
2667
+ Message.error('没有此菜单!');
2664
2668
  }
2665
2669
  },
2666
2670
  // 监听改变菜单