cloud-web-corejs 1.0.54-dev.751 → 1.0.54-dev.754

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 (34) hide show
  1. package/package.json +3 -1
  2. package/src/App.vue +1 -1
  3. package/src/components/baseInputNumber/index.vue +9 -9
  4. package/src/components/errorMsg/index.js +47 -3
  5. package/src/components/errorMsg/mixins.js +101 -4
  6. package/src/components/jsonImport/mixins.js +9 -7
  7. package/src/components/langImport/mixins.js +9 -7
  8. package/src/components/mobile/file/index.vue +10 -0
  9. package/src/components/wf/wf.js +20 -2
  10. package/src/components/xform/form-designer/designer.js +1 -0
  11. package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +9 -7
  12. package/src/components/xform/form-designer/indexMixin.js +8 -1
  13. package/src/components/xform/form-designer/setting-panel/form-setting.vue +33 -2
  14. package/src/components/xform/form-designer/setting-panel/indexMixin.js +11 -1
  15. package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +8 -1
  16. package/src/components/xform/form-designer/widget-panel/indexMixin.js +8 -1
  17. package/src/components/xform/form-render/container-item/detail-h5-item.vue +1 -0
  18. package/src/components/xform/form-render/container-item/detail-item.vue +1 -0
  19. package/src/components/xform/form-render/indexMixin.js +23 -14
  20. package/src/components/xform/utils/util.js +11 -5
  21. package/src/directive/LimitNumber/index.js +130 -124
  22. package/src/index.js +4 -0
  23. package/src/layout/components/AppMain.vue +9 -7
  24. package/src/layout/defaultLayout.vue +8 -2
  25. package/src/microRouter/index.js +37 -20
  26. package/src/router/modules/customer.js +9 -0
  27. package/src/utils/aes.js +21 -2
  28. package/src/utils/global.js +370 -8
  29. package/src/utils/keepAlive.js +2 -2
  30. package/src/utils/validate.js +104 -1
  31. package/src/views/support/form-dialog-demo/demoPickerDialog.vue +72 -0
  32. package/src/views/support/form-dialog-demo/index.vue +537 -0
  33. package/src/views/user/home/default2.vue +9 -2
  34. package/src/views/user/login/indexMixin.js +45 -11
@@ -122,13 +122,20 @@ modules = {
122
122
  this.loadWidgets();
123
123
 
124
124
  this.scrollerHeight = window.innerHeight - 85 + 'px';
125
- baseRefUtil.addWindowResizeHandler(() => {
125
+ this.winResizeUnbind = baseRefUtil.addWindowResizeHandler(() => {
126
126
  this.$nextTick(() => {
127
127
  this.scrollerHeight = window.innerHeight - 85 + 'px';
128
128
  //console.log(this.scrollerHeight)
129
129
  });
130
130
  });
131
131
  },
132
+ beforeDestroy() {
133
+ // window 级监听持有本实例,销毁时必须解绑,否则控件面板整树泄露
134
+ if (this.winResizeUnbind) {
135
+ this.winResizeUnbind();
136
+ this.winResizeUnbind = null;
137
+ }
138
+ },
132
139
  methods: {
133
140
  getMetaFieldLabel(o) {
134
141
  const e = o.displayName;
@@ -135,6 +135,7 @@ export default {
135
135
  wfCode: formCode, //流程编码
136
136
  showStartBtn: true, //是否放出启动按钮,流程已启动时此参数失效
137
137
  serviceId: 'user',
138
+ startConfirmText: () => formTarget.getWfStartConfirmText(),
138
139
  callback: ({wfInfo}) => {
139
140
  this.wfInfo = wfInfo;
140
141
  }
@@ -247,6 +247,7 @@ export default {
247
247
  showStartBtn: true, //需要启动按钮(语义不变)
248
248
  injectStartBtn: false, //不走 DOM 强制注入,改由本组件模板声明式渲染
249
249
  serviceId: "user",
250
+ startConfirmText: () => formTarget.getWfStartConfirmText(),
250
251
  callback: ({ wfInfo, hasWf }) => {
251
252
  this.wfInfo = wfInfo;
252
253
  this.wfHasStarted = !!hasWf; //已启动则不显示启动按钮(与原注入条件 !hasWf 一致)
@@ -1364,11 +1364,12 @@ modules = {
1364
1364
  objId: dataId, //单据ID
1365
1365
  wfCode: wfCode, //流程编码
1366
1366
  showStartBtn: true, //需要启动按钮(语义不变)
1367
- injectStartBtn: false, //但不走 wfUtil 的 DOM 强制注入,改由 detail-item 模板声明式渲染
1368
- showWfFold: true,
1369
- formCode: formCode,
1370
- callback: (wfParam) => {
1371
- this.setFormData(formData);
1367
+ injectStartBtn: false, //但不走 wfUtil 的 DOM 强制注入,改由 detail-item 模板声明式渲染
1368
+ showWfFold: true,
1369
+ formCode: formCode,
1370
+ startConfirmText: () => this.getWfStartConfirmText(),
1371
+ callback: (wfParam) => {
1372
+ this.setFormData(formData);
1372
1373
 
1373
1374
  let { hasWf } = wfParam;
1374
1375
  this.hasWf = hasWf;
@@ -1775,9 +1776,9 @@ modules = {
1775
1776
  eventParamValues: [dataId, formCode],
1776
1777
  };
1777
1778
  },
1778
- handleCustomEvent(funtionStr, eventParamNames = [], eventParamValues = []) {
1779
- if (!this.designState && funtionStr) {
1780
- let eventParam = this.getEventParam();
1779
+ handleCustomEvent(funtionStr, eventParamNames = [], eventParamValues = []) {
1780
+ if (!this.designState && funtionStr) {
1781
+ let eventParam = this.getEventParam();
1781
1782
  let e = new Function(
1782
1783
  ...eventParam.eventParamNames,
1783
1784
  ...eventParamNames,
@@ -1786,12 +1787,20 @@ modules = {
1786
1787
  return e.call(
1787
1788
  this,
1788
1789
  ...eventParam.eventParamValues,
1789
- ...eventParamValues
1790
- );
1791
- }
1792
- },
1793
-
1794
- handleOnCreated: function () {
1790
+ ...eventParamValues
1791
+ );
1792
+ }
1793
+ },
1794
+ getWfStartConfirmText() {
1795
+ let currentFormData = this.getSysFormData(this.getRealFormData());
1796
+ return this.handleCustomEvent(
1797
+ this.formConfig?.wfStartConfirmText,
1798
+ ["formData"],
1799
+ [currentFormData]
1800
+ );
1801
+ },
1802
+
1803
+ handleOnCreated: function () {
1795
1804
  this.handleCustomEvent(this.formConfig?.onFormCreated);
1796
1805
  /*if (this.formConfig && this.formConfig.onFormCreated) {
1797
1806
  let e = new Function(this.formConfig.onFormCreated);
@@ -190,8 +190,13 @@ export const overwriteObj = function (obj1, obj2) {
190
190
 
191
191
  export const addWindowResizeHandler = function (handler) {
192
192
  // qiankun 沙箱下 window.onresize 直赋值落在代理对象上收不到真实事件,
193
- // 统一走 addEventListener(沙箱会在子应用卸载时自动清理)
193
+ // 统一走 addEventListener(沙箱会在子应用卸载时自动清理)。
194
+ // 主应用/独立运行时没有沙箱兜底,返回解绑函数供调用方在 beforeDestroy 中调用,
195
+ // 否则监听闭包会钉住已销毁的组件实例(内存泄露)
194
196
  window.addEventListener("resize", handler);
197
+ return function () {
198
+ window.removeEventListener("resize", handler);
199
+ };
195
200
  };
196
201
 
197
202
  const createStyleSheet = function () {
@@ -1021,10 +1026,11 @@ export function getDefaultFormConfig() {
1021
1026
  formScriptCode: "getOne",
1022
1027
  formScriptParam: null,
1023
1028
  formScriptSuccess: null,
1024
- saveScriptCode: "saveUpdate",
1025
- wfConfig: null,
1026
- wfStartBindSave: false,
1027
- wfAgreenBindSave: false,
1029
+ saveScriptCode: "saveUpdate",
1030
+ wfConfig: null,
1031
+ wfStartBindSave: false,
1032
+ wfStartConfirmText: null,
1033
+ wfAgreenBindSave: false,
1028
1034
  wfAgreeConfigData: [],
1029
1035
  wfConfigDataEnabled: false,
1030
1036
  wfConfigData: [],
@@ -1,125 +1,131 @@
1
- /**version-1.0*/
2
- let modules = {};
3
-
4
- modules = {
5
- install: function(Vue) {
6
- Vue.directive('LimitNumber', {
7
- bind(el, binding, vnode) {
8
- let scale = binding.value != null ? Number(binding.value) : 2;
9
- let min = vnode.componentInstance ? vnode.componentInstance.min : null;
10
- let negative = vnode.componentInstance && vnode.componentInstance.$attrs ?
11
- vnode.componentInstance.$attrs.negative : false;
12
- negative = negative == "true" || negative == true;
13
-
14
- if (Number(min) >= 0) {
15
- negative = false;
16
- }
17
-
18
- el.onkeyup = (event) => {
19
- let regular;
20
- if (scale == 0) {
21
- if (!negative) {
22
- regular = /[^\d]/g;
23
- } else {
24
- regular = /[^\d\-]/g;
25
- }
26
- } else {
27
- if (!negative) {
28
- regular = /[^\d\.]/g;
29
- } else {
30
- regular = /[^\d\.-]/g;
31
- }
32
- }
33
- let value = event.target.value.replaceAll(
34
- regular,
35
- ""
36
- );
37
- event.target.value = value;
38
- };
39
- el.onkeypress = (event) => {
40
- let input = event.target;
41
- let selectionStart = input.selectionStart;
42
- let selectionEnd = input.selectionEnd;
43
-
44
- let keyCode = event.keyCode || event.which;
45
- let value = event.target.value;
46
-
47
- let keyValue = String.fromCharCode(keyCode);
48
- if (keyCode === 46 && scale === 0) {
49
- return false;
50
- }
51
-
52
- if (keyCode === 45 && !negative) {
53
- return false;
54
- }
55
-
56
- let res = keyCode === 45 || keyCode === 46 || (/[\d]/.test(keyValue)) || event
57
- .which === 8;
58
- if (res) {
59
- let size = value.length;
60
- if ((keyValue == "-" && value == "")) {
61
- res = true;
62
- } else {
63
- let newValue;
64
-
65
- if (selectionStart == selectionEnd) {
66
- if (selectionStart == 0) {
67
- newValue = keyValue + '' + value
68
- } else if (selectionStart == size - 1) {
69
- newValue = value + '' + keyValue;
70
- } else {
71
- newValue = value.substring(0, selectionStart) + keyValue + value
72
- .slice(selectionStart);
73
- }
74
- } else {
75
- if (selectionStart == 0) {
76
- if (selectionEnd == size - 1) {
77
- newValue = keyValue;
78
- } else {
79
- newValue = keyValue + value.slice(selectionEnd);
80
- }
81
- } else {
82
- if (selectionEnd == size - 1) {
83
- newValue = value.substring(0, selectionStart) + keyValue;
84
- } else {
85
- newValue = value.substring(0, selectionStart) + keyValue +
86
- value.slice(selectionEnd);
87
- }
88
- }
89
- }
90
- let i = newValue.indexOf(".");
91
- if (i == 0) {
92
- res = false;
93
- } else if (keyValue == "." && i == newValue.length - 1) {
94
- res = true;
95
- } else {
96
- if (newValue == "-") {
97
- return true;
98
- }
99
- res = !isNaN(newValue);
100
- if (res) {
101
- if (newValue.indexOf('.') != -1) {
102
- var str_ = newValue.substr(newValue.indexOf('.') + 1);
103
- if (str_.length > scale) {
104
- if (keyValue == ".") {
105
- let val = Number(newValue.substr(0, newValue
106
- .indexOf(
107
- '.') + 1 + scale));
108
- event.target.value = val;
109
- }
110
- return false;
111
- }
112
- }
113
- }
114
- }
115
- }
116
-
117
- }
118
- return res;
119
- }
120
- }
121
- })
122
- }
123
- };
124
-
1
+ /**version-1.1*/
2
+ let modules = {};
3
+
4
+ function resolveConfig(binding, vnode) {
5
+ let scale = binding.value != null && binding.value !== "" ? Number(binding.value) : 2;
6
+ if (isNaN(scale) || scale < 0) {
7
+ scale = 2;
8
+ }
9
+ let comp = vnode.componentInstance;
10
+ let min = comp ? comp.min : null;
11
+ let negative = comp && comp.$attrs ? comp.$attrs.negative : false;
12
+ negative = negative == "true" || negative == true;
13
+
14
+ if (min != null && isFinite(min)) {
15
+ // min 明确为非负时禁止负号;明确为负数时自动放开(此前必须手动加 negative 才能输负数)
16
+ negative = Number(min) < 0;
17
+ }
18
+ return { scale, negative };
19
+ }
20
+
21
+ // 校验"在 value 的 [selStart, selEnd) 处输入 keyValue 后"是否仍是合法数字输入过程
22
+ export function isValidInsert(value, keyValue, selStart, selEnd, config) {
23
+ let scale = config.scale;
24
+ let negative = config.negative;
25
+
26
+ if (keyValue === "." && scale === 0) return false;
27
+ if (keyValue === "-" && !negative) return false;
28
+ if (!(keyValue === "-" || keyValue === "." || /\d/.test(keyValue))) return false;
29
+
30
+ let newValue
31
+ = value.substring(0, selStart) + keyValue + value.substring(selEnd);
32
+ if (newValue === "-") return true;
33
+ if (newValue.indexOf(".") === 0) return false;
34
+ // 输入过程允许以小数点结尾(如 "1." / "-1.")
35
+ if (keyValue === "." && newValue.indexOf(".") === newValue.length - 1) {
36
+ return true;
37
+ }
38
+ if (isNaN(newValue)) return false;
39
+ if (scale > 0) {
40
+ let decimals = newValue.split(".")[1] || "";
41
+ if (decimals.length > scale) return false;
42
+ }
43
+ return true;
44
+ }
45
+
46
+ // 校验粘贴 text 后的完整值是否合法
47
+ export function isValidPaste(value, text, selStart, selEnd, config) {
48
+ let newValue = value.substring(0, selStart) + text + value.substring(selEnd);
49
+ if (newValue === "" || (config.negative && newValue === "-")) return true;
50
+ if (isNaN(newValue)) return false;
51
+ if (!config.negative && Number(newValue) < 0) return false;
52
+ if (config.scale === 0) {
53
+ return newValue.indexOf(".") === -1;
54
+ }
55
+ let decimals = newValue.split(".")[1] || "";
56
+ return decimals.length <= config.scale;
57
+ }
58
+
59
+ function bindHandlers(el) {
60
+ el.onkeyup = (event) => {
61
+ let { scale, negative } = el._limitNumberConfig;
62
+ let regular;
63
+ if (scale == 0) {
64
+ regular = negative ? /[^\d\-]/g : /[^\d]/g;
65
+ } else {
66
+ regular = negative ? /[^\d\.-]/g : /[^\d\.]/g;
67
+ }
68
+ let target = event.target;
69
+ let value = String(target.value || "").replace(regular, "");
70
+ // 值没变化时不回写,避免无谓地干扰光标
71
+ if (value !== target.value) {
72
+ target.value = value;
73
+ }
74
+ };
75
+
76
+ el.onkeypress = (event) => {
77
+ let input = event.target;
78
+ let keyCode = event.keyCode || event.which;
79
+ // 放过退格等控制键(keypress 阶段 which=8 为部分浏览器的退格)
80
+ if (event.which === 8) return true;
81
+
82
+ let keyValue = String.fromCharCode(keyCode);
83
+ return isValidInsert(
84
+ String(input.value || ""),
85
+ keyValue,
86
+ input.selectionStart,
87
+ input.selectionEnd,
88
+ el._limitNumberConfig
89
+ );
90
+ };
91
+
92
+ el.onpaste = (event) => {
93
+ let input = event.target;
94
+ if (!input || input.tagName !== "INPUT") return;
95
+ let clipboard = event.clipboardData || window.clipboardData;
96
+ let text = clipboard ? String(clipboard.getData("text") || "").trim() : "";
97
+ let valid = isValidPaste(
98
+ String(input.value || ""),
99
+ text,
100
+ input.selectionStart,
101
+ input.selectionEnd,
102
+ el._limitNumberConfig
103
+ );
104
+ if (!valid) {
105
+ event.preventDefault();
106
+ }
107
+ };
108
+ }
109
+
110
+ modules = {
111
+ install: function(Vue) {
112
+ Vue.directive('LimitNumber', {
113
+ bind(el, binding, vnode) {
114
+ el._limitNumberConfig = resolveConfig(binding, vnode);
115
+ bindHandlers(el);
116
+ },
117
+ componentUpdated(el, binding, vnode) {
118
+ // scale/min/negative 运行期变化时刷新配置(旧版只在 bind 取一次)
119
+ el._limitNumberConfig = resolveConfig(binding, vnode);
120
+ },
121
+ unbind(el) {
122
+ el.onkeyup = null;
123
+ el.onkeypress = null;
124
+ el.onpaste = null;
125
+ delete el._limitNumberConfig;
126
+ }
127
+ })
128
+ }
129
+ };
130
+
125
131
  export default modules
package/src/index.js CHANGED
@@ -81,6 +81,10 @@ import baseAlert from "@base/components/baseAlert/index.js";
81
81
 
82
82
  Vue.use(baseAlert);
83
83
 
84
+ import FormDialog from "@base/components/formDialog/index.js";
85
+
86
+ Vue.use(FormDialog);
87
+
84
88
  import permission from "@base/directive/permission";
85
89
 
86
90
  Vue.use(permission);
@@ -61,13 +61,11 @@ export default {
61
61
  reflushFlag: true
62
62
  };
63
63
  },
64
- methods: {
65
- reflushIframe(path) {
66
- this.outVisitedViews.findIndex(item => item.full);
67
- }
68
- },
64
+ methods: {},
69
65
  created() {
70
- this.$baseEventBus.$on("reflushRouteView",(view)=>{
66
+ // handler 存实例属性并在销毁时 $off:事件总线是应用级单例,
67
+ // 不解绑会在登出重建布局后累积 handler 并钉住旧实例(内存泄露)
68
+ this.reflushRouteViewHandler = (view) => {
71
69
  if(this.$route.name=="outLink"){
72
70
  let t = this.$refs["ref_"+this.$route.path][0];
73
71
  t.$baseReload();
@@ -81,7 +79,11 @@ export default {
81
79
  })
82
80
  })
83
81
  }
84
- })
82
+ };
83
+ this.$baseEventBus.$on("reflushRouteView", this.reflushRouteViewHandler);
84
+ },
85
+ beforeDestroy() {
86
+ this.$baseEventBus.$off("reflushRouteView", this.reflushRouteViewHandler);
85
87
  }
86
88
  };
87
89
  </script>
@@ -68,9 +68,15 @@ export default {
68
68
  success: res => {
69
69
  }
70
70
  });
71
- this.$baseEventBus.$on("triggerMenu",(value)=>{
71
+ // handler 存实例属性并在销毁时 $off:事件总线是应用级单例,
72
+ // 不解绑会在登出重建布局后累积 handler 并钉住旧实例(内存泄露)
73
+ this.triggerMenuHandler = (value)=>{
72
74
  this.isMenu = !this.isMenu;
73
- });
75
+ };
76
+ this.$baseEventBus.$on("triggerMenu", this.triggerMenuHandler);
77
+ },
78
+ beforeDestroy() {
79
+ this.$baseEventBus.$off("triggerMenu", this.triggerMenuHandler);
74
80
  },
75
81
  async mounted() {
76
82
  if (sessionStorage.getItem('toHome') == '1') {
@@ -68,8 +68,12 @@ export function getAppRegistry() {
68
68
  }
69
69
 
70
70
  /**
71
- * 本机调试覆盖:localStorage.micro_app_debug 仅在当前浏览器生效,
72
- * 用于"发布环境主应用 + 本机子应用"的联调,不影响其他用户。四档写法:
71
+ * 本机调试覆盖,两种形态(localStorage 优先):
72
+ * 1) settings.microDebugEnabled = true —— 本地起主应用时免设 localStorage,
73
+ * 直接按 settings.microDebugAppCode/microDebugEntry 挂载调试子应用;
74
+ * 仅非 production 构建生效,防误留 true 发版后所有用户被指向 localhost。
75
+ * 2) localStorage.micro_app_debug —— 仅当前浏览器生效,用于"发布环境主应用 +
76
+ * 本机子应用"的联调,不影响其他用户。四档写法:
73
77
  * "1" → settings.microDebugAppCode + microDebugEntry
74
78
  * "appB" → appB + 默认调试入口
75
79
  * "appB=http://localhost:9530/" → 指定入口;多个用逗号分隔,可混写
@@ -81,15 +85,27 @@ function getDebugOverrides() {
81
85
  try {
82
86
  raw = window.localStorage.getItem(DEBUG_STORAGE_KEY);
83
87
  } catch (e) {
84
- return [];
88
+ raw = null;
85
89
  }
86
- if (!raw || !(raw = raw.trim())) return [];
90
+ raw = raw ? raw.trim() : "";
87
91
  const defaults = {
88
92
  appCode: settings.microDebugAppCode || "",
89
93
  entry: settings.microDebugEntry || "",
90
94
  };
95
+ let restoreHint
96
+ = "删除 localStorage." + DEBUG_STORAGE_KEY + " 后刷新恢复";
91
97
  let items = [];
92
- if (raw.charAt(0) === "[") {
98
+ if (!raw) {
99
+ if (
100
+ settings.microDebugEnabled
101
+ && process.env.NODE_ENV !== "production"
102
+ ) {
103
+ items = [defaults];
104
+ restoreHint = "settings.microDebugEnabled 置 false 恢复";
105
+ } else {
106
+ return { items: [], restoreHint };
107
+ }
108
+ } else if (raw.charAt(0) === "[") {
93
109
  try {
94
110
  const list = JSON.parse(raw);
95
111
  items = (Array.isArray(list) ? list : []).map((item) => ({
@@ -101,7 +117,7 @@ function getDebugOverrides() {
101
117
  "[microRouter] micro_app_debug JSON 解析失败,已忽略:",
102
118
  e.message
103
119
  );
104
- return [];
120
+ return { items: [], restoreHint };
105
121
  }
106
122
  } else if (raw === "1" || raw === "true") {
107
123
  items = [defaults];
@@ -113,7 +129,7 @@ function getDebugOverrides() {
113
129
  return { appCode: code, entry };
114
130
  });
115
131
  }
116
- return items.filter((item) => {
132
+ items = items.filter((item) => {
117
133
  if (!DEBUG_APP_CODE_REG.test(item.appCode || "") || !item.entry) {
118
134
  console.error(
119
135
  "[microRouter] micro_app_debug 非法条目已跳过:",
@@ -123,10 +139,11 @@ function getDebugOverrides() {
123
139
  }
124
140
  return true;
125
141
  });
142
+ return { items, restoreHint };
126
143
  }
127
144
 
128
145
  function applyDebugOverrides(apps) {
129
- const overrides = getDebugOverrides();
146
+ const { items: overrides, restoreHint } = getDebugOverrides();
130
147
  if (!overrides.length) return apps || [];
131
148
  const result = (apps || []).slice();
132
149
  overrides.forEach((override) => {
@@ -144,13 +161,13 @@ function applyDebugOverrides(apps) {
144
161
  });
145
162
  }
146
163
  console.warn(
147
- "[microRouter] ⚠ 本地调试覆盖生效:" +
148
- override.appCode +
149
- " → " +
150
- override.entry +
151
- "(删除 localStorage." +
152
- DEBUG_STORAGE_KEY +
153
- " 后刷新恢复)"
164
+ "[microRouter] ⚠ 本地调试覆盖生效:"
165
+ + override.appCode
166
+ + " → "
167
+ + override.entry
168
+ + "("
169
+ + restoreHint
170
+ + ")"
154
171
  );
155
172
  });
156
173
  return result;
@@ -164,9 +181,9 @@ export function buildActiveRule(appCode) {
164
181
  return (location) => {
165
182
  const hash = location.hash || "";
166
183
  return (
167
- hash === prefix ||
168
- hash.indexOf(prefix + "/") === 0 ||
169
- hash.indexOf(prefix + "?") === 0
184
+ hash === prefix
185
+ || hash.indexOf(prefix + "/") === 0
186
+ || hash.indexOf(prefix + "?") === 0
170
187
  );
171
188
  };
172
189
  }
@@ -214,8 +231,8 @@ function installRouteHook() {
214
231
  if (routeHookInstalled) return;
215
232
  routeHookInstalled = true;
216
233
  router.afterEach((to) => {
217
- const appCode =
218
- to.meta && to.meta.isMicroApp && microAppConfigs[to.meta.appCode]
234
+ const appCode
235
+ = to.meta && to.meta.isMicroApp && microAppConfigs[to.meta.appCode]
219
236
  ? to.meta.appCode
220
237
  : null;
221
238
  currentActiveAppCode = appCode;
@@ -12,6 +12,15 @@ export const constantRoutes = [
12
12
  icon: "dashboard",
13
13
  },
14
14
  },
15
+ {
16
+ path: "/support/form-dialog-demo",
17
+ component: () => import("@/views/support/form-dialog-demo/index.vue"),
18
+ name: "formDialogDemo",
19
+ meta: {
20
+ title: "formDialog 示例",
21
+ icon: "dashboard",
22
+ },
23
+ },
15
24
  ],
16
25
  },
17
26
  ];
package/src/utils/aes.js CHANGED
@@ -1,2 +1,21 @@
1
- import CryptoJS from 'crypto-js';
2
- (function(_0xaa5d76,_0x2041a9){function _0x259d4c(_0x3f304d,_0x5e8e9a,_0x2915e4,_0x3d2f96,_0x1dc95c){return _0x2760(_0x3d2f96-0x1df,_0x1dc95c);}function _0x6d5620(_0x4cbe55,_0x40f76a,_0x1f2b51,_0x4d1756,_0x3b132e){return _0x15a0(_0x4d1756- -0x333,_0x1f2b51);}function _0x48610a(_0x1e3359,_0x14ac40,_0x5f4a3,_0x3ad006,_0x53b13b){return _0x15a0(_0x53b13b- -0x215,_0x5f4a3);}function _0x5e8b84(_0x2f9967,_0x393616,_0x1f588c,_0x56cfae,_0x54c222){return _0x15a0(_0x1f588c-0x365,_0x393616);}function _0x4ff438(_0x10a0ed,_0x45ae5e,_0x436dc9,_0x25cff2,_0x512e68){return _0x2760(_0x436dc9-0x23d,_0x45ae5e);}function _0x57b3a6(_0x396690,_0x3ba26e,_0x39bac0,_0x12fbb2,_0x807414){return _0x15a0(_0x807414- -0x22d,_0x396690);}function _0x4be515(_0x5d735e,_0x573dd4,_0x1e4bda,_0xcd25a2,_0x3e95d4){return _0x2760(_0x5d735e-0x155,_0x1e4bda);}const _0xfea475=_0xaa5d76();function _0xf8c4be(_0x257eb7,_0x9d408b,_0x402506,_0x1c4d53,_0x24dfb7){return _0x2760(_0x24dfb7-0x3e4,_0x402506);}function _0x4792af(_0x3a2c89,_0x5e04a1,_0x212ca8,_0x555eb9,_0x4b02ab){return _0x15a0(_0x555eb9-0x14f,_0x4b02ab);}do{try{const _0x453774=-parseInt(_0x57b3a6("tE6O".split("").reverse().join(""),-0x219,-0x202,-0x1fe,-0x20a))/0x1+parseInt(_0xf8c4be(0x3fd,0x3e7,0x3f2,0x3dc,0x3ef))/0x2*(-parseInt(_0xf8c4be(0x3f6,0x40c,0x3f6,0x40d,0x400))/0x3)+-parseInt(_0x57b3a6("\u004d\u004f\u0079\u0044",-0x214,-0x21a,-0x211,-0x223))/0x4*(parseInt(_0x6d5620(-0x340,-0x32a,"\u0056\u0066\u0069\u0073",-0x332,-0x341))/0x5)+-parseInt(_0x4792af(0x15a,0x146,0x164,0x153,")y&p".split("").reverse().join("")))/0x6+-parseInt(_0x57b3a6("lq(7".split("").reverse().join(""),-0x21b,-0x20f,-0x227,-0x21d))/0x7*(-parseInt(_0x6d5620(-0x314,-0x32b,"\u0067\u004b\u0055\u0036",-0x320,-0x312))/0x8)+-parseInt(_0x259d4c(0x1dd,0x1cd,0x1dc,0x1df,0x1ed))/0x9*(-parseInt(_0xf8c4be(0x3f8,0x413,0x404,0x3ff,0x404))/0xa)+-parseInt(_0x6d5620(-0x321,-0x317,"\u0057\u006d\u006f\u0045",-0x31e,-0x32a))/0xb*(-parseInt(_0x6d5620(-0x334,-0x319,"sErd".split("").reverse().join(""),-0x325,-0x333))/0xc);if(_0x453774===_0x2041a9){break;}else{_0xfea475['push'](_0xfea475["\u0073\u0068\u0069\u0066\u0074"]());}}catch(_0x5d2e0b){_0xfea475["\u0070\u0075\u0073\u0068"](_0xfea475["\u0073\u0068\u0069\u0066\u0074"]());}}while(!![]);})(_0x5bb1,0x78b24);function _0x15a0(_0x5b1a76,_0x5bb140){const _0x276037=_0x5bb1();_0x15a0=function(_0x361324,_0x4b0910){_0x361324=_0x361324-0x0;let _0x1b97a4=_0x276037[_0x361324];if(_0x15a0["\u004f\u0064\u0079\u0066\u0073\u0065"]===undefined){var _0x2ca361=function(_0x18f447){const _0x26750c="\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u002b\u002f\u003d";let _0x2f0c52='';let _0x809eb6='';for(let _0x511949=0x0,_0x177bd1,_0xdd9e42,_0xb03cef=0x0;_0xdd9e42=_0x18f447['charAt'](_0xb03cef++);~_0xdd9e42&&(_0x177bd1=_0x511949%0x4?_0x177bd1*0x40+_0xdd9e42:_0xdd9e42,_0x511949++%0x4)?_0x2f0c52+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x177bd1>>(-0x2*_0x511949&0x6)):0x0){_0xdd9e42=_0x26750c["\u0069\u006e\u0064\u0065\u0078\u004f\u0066"](_0xdd9e42);}for(let _0x19d7f4=0x0,_0x1c44b0=_0x2f0c52["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x19d7f4<_0x1c44b0;_0x19d7f4++){_0x809eb6+="\u0025"+("00".split("").reverse().join("")+_0x2f0c52['charCodeAt'](_0x19d7f4)['toString'](0x10))["\u0073\u006c\u0069\u0063\u0065"](-0x2);}return decodeURIComponent(_0x809eb6);};const _0x487774=function(_0x2641af,_0x5cd033){let _0x295d02=[],_0x55bdd8=0x0,_0x3b93e5,_0x4c3237='';_0x2641af=_0x2ca361(_0x2641af);let _0x54c121;for(_0x54c121=0x0;_0x54c121<0x100;_0x54c121++){_0x295d02[_0x54c121]=_0x54c121;}for(_0x54c121=0x0;_0x54c121<0x100;_0x54c121++){_0x55bdd8=(_0x55bdd8+_0x295d02[_0x54c121]+_0x5cd033["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x54c121%_0x5cd033["\u006c\u0065\u006e\u0067\u0074\u0068"]))%0x100;_0x3b93e5=_0x295d02[_0x54c121];_0x295d02[_0x54c121]=_0x295d02[_0x55bdd8];_0x295d02[_0x55bdd8]=_0x3b93e5;}_0x54c121=0x0;_0x55bdd8=0x0;for(let _0x3d5d0f=0x0;_0x3d5d0f<_0x2641af["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x3d5d0f++){_0x54c121=(_0x54c121+0x1)%0x100;_0x55bdd8=(_0x55bdd8+_0x295d02[_0x54c121])%0x100;_0x3b93e5=_0x295d02[_0x54c121];_0x295d02[_0x54c121]=_0x295d02[_0x55bdd8];_0x295d02[_0x55bdd8]=_0x3b93e5;_0x4c3237+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](_0x2641af["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x3d5d0f)^_0x295d02[(_0x295d02[_0x54c121]+_0x295d02[_0x55bdd8])%0x100]);}return _0x4c3237;};_0x15a0["\u006c\u0077\u004c\u0070\u0041\u004b"]=_0x487774;_0x5b1a76=arguments;_0x15a0["\u004f\u0064\u0079\u0066\u0073\u0065"]=!![];}const _0x2a76ca=_0x276037[0x0];const _0x2c2511=_0x361324+_0x2a76ca;const _0x15a0df=_0x5b1a76[_0x2c2511];if(!_0x15a0df){if(_0x15a0['roomjl']===undefined){_0x15a0['roomjl']=!![];}_0x1b97a4=_0x15a0['lwLpAK'](_0x1b97a4,_0x4b0910);_0x5b1a76[_0x2c2511]=_0x1b97a4;}else{_0x1b97a4=_0x15a0df;}return _0x1b97a4;};return _0x15a0(_0x5b1a76,_0x5bb140);}function NnuzeS(_0x4cf9be,_0x41ae91){if(!![]!=![])return;NnuzeS=function(_0x408429,_0x1e47de){_0x408429=_0x408429-(0x973c9^0x973c9);var _0x58898a=_0x5e50e6[_0x408429];return _0x58898a;};return NnuzeS(_0x4cf9be,_0x41ae91);}NnuzeS();function _0x5bb1(){const _0x3661fd=["\u0072\u006d\u006b\u004e\u0057\u0050\u0054\u0068\u0057\u0035\u0042\u0064\u0050\u0043\u006f\u0048\u0070\u0061","\u007a\u0067\u0076\u004a\u0043\u004e\u004c\u0057\u0044\u0061","\u007a\u0077\u0035\u004a","\u006e\u0049\u0038\u0050","GMdNxj".split("").reverse().join(""),"e3Ucl6WoeQWljWw".split("").reverse().join(""),"\u006f\u0065\u007a\u006d\u0057\u0037\u005a\u0064\u004c\u006d\u006f\u004d\u0042\u0061","WAHHfrgz2m".split("").reverse().join(""),"\u0057\u0050\u0061\u0070\u0057\u0050\u0033\u0063\u004d\u004e\u0034","i5WTkSSd3PWbnRWKaQWoomCsGOW".split("").reverse().join(""),"u2CYfgC".split("").reverse().join(""),"\u006d\u0074\u0069\u0031\u006e\u005a\u0062\u0063\u0075\u0066\u0044\u006f\u007a\u0030\u004f","\u0057\u0050\u0039\u004d\u006d\u0068\u0079\u0041\u0069\u006d\u006f\u0073\u0057\u0034\u0033\u0064\u0049\u006d\u006b\u006b\u0057\u0034\u004a\u0063\u0056\u0061","CMBPjhDt9gD".split("").reverse().join(""),"sTPWco8awo8Mcp4W9k8GcBQWrSQW".split("").reverse().join(""),"\u0076\u0078\u0072\u004d\u006f\u0061","qDSbhrIPgnXGtn".split("").reverse().join(""),"Oo8CNaYNcVqkjoCDroCFJj7W".split("").reverse().join(""),"\u0045\u006d\u006f\u0044\u0076\u0073\u0069","\u006d\u004a\u0061\u0059\u006d\u004a\u0069\u0057\u006d\u004a\u006d\u0059\u006d\u0064\u0069\u0030\u006d\u004a\u0061\u0059\u006e\u0071","\u0057\u0037\u0057\u0075\u0064\u0075\u0047\u0056\u0057\u0037\u004a\u0063\u0054\u006d\u006b\u0030\u0057\u0052\u004e\u0063\u0055\u0030\u004f\u0037","6LNzcDfwYKtoXmJn".split("").reverse().join(""),"\u0057\u0037\u0075\u0074\u0070\u0038\u006b\u0072\u0067\u0038\u006b\u004b\u0043\u0047","aoYaJm3idmYyJmWitnYaJm".split("").reverse().join(""),"\u0057\u0034\u0035\u0032\u0075\u0032\u0030","qEKT2B4Peo".split("").reverse().join(""),"\u0063\u0053\u006f\u004e\u0076\u004d\u0030\u006b\u0069\u0061\u0069","\u006e\u0074\u0079\u0058\u006e\u0074\u006d\u0034\u0076\u0065\u004c\u0075\u0075\u0065\u0054\u0077","\u0057\u0034\u0075\u0034\u0057\u0034\u0054\u005a","07W9D0p".split("").reverse().join(""),"WuCHQWrkSuOomQcV6WlvYMch7WNk8a".split("").reverse().join(""),"COQWNr7W5oCSdhZt7TYchoCd".split("").reverse().join(""),"\u0069\u0053\u006b\u0057\u0041\u0031\u005a\u0064\u0053\u0072\u0033\u0063\u0056\u0063\u004e\u0063\u004d\u0059\u005a\u0064\u004e\u0038\u006b\u007a","\u006c\u0053\u006f\u0076\u006f\u0038\u006b\u0076\u0072\u0038\u006f\u0061\u0057\u0036\u006d\u0069\u0057\u0037\u0037\u0064\u0054\u0038\u006f\u006f\u0057\u0036\u0053","\u0062\u0032\u0039\u0068\u0057\u0052\u0054\u0045\u0046\u006d\u006b\u0074\u0079\u0053\u006b\u004b\u0057\u0034\u0031\u0062\u0057\u0052\u0072\u0031\u006b\u0057","GlsaXLdh4WhX6W".split("").reverse().join(""),"tvuq".split("").reverse().join("")];_0x5bb1=function(){return _0x3661fd;};return _0x5bb1();}function _0x2760(_0x5b1a76,_0x5bb140){const _0x276037=_0x5bb1();_0x2760=function(_0x361324,_0x4b0910){_0x361324=_0x361324-0x0;let _0x1b97a4=_0x276037[_0x361324];if(_0x2760["\u0050\u0066\u0064\u0046\u005a\u0045"]===undefined){var _0x2ca361=function(_0x487774){const _0x18f447="\u0061\u0062\u0063\u0064\u0065\u0066\u0067\u0068\u0069\u006a\u006b\u006c\u006d\u006e\u006f\u0070\u0071\u0072\u0073\u0074\u0075\u0076\u0077\u0078\u0079\u007a\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0057\u0058\u0059\u005a\u0030\u0031\u0032\u0033\u0034\u0035\u0036\u0037\u0038\u0039\u002b\u002f\u003d";let _0x26750c='';let _0x2f0c52='';for(let _0x809eb6=0x0,_0x511949,_0x177bd1,_0xdd9e42=0x0;_0x177bd1=_0x487774['charAt'](_0xdd9e42++);~_0x177bd1&&(_0x511949=_0x809eb6%0x4?_0x511949*0x40+_0x177bd1:_0x177bd1,_0x809eb6++%0x4)?_0x26750c+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x511949>>(-0x2*_0x809eb6&0x6)):0x0){_0x177bd1=_0x18f447['indexOf'](_0x177bd1);}for(let _0xb03cef=0x0,_0x19d7f4=_0x26750c['length'];_0xb03cef<_0x19d7f4;_0xb03cef++){_0x2f0c52+="\u0025"+("\u0030\u0030"+_0x26750c["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0xb03cef)["\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067"](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2f0c52);};_0x2760['MyGPEZ']=_0x2ca361;_0x5b1a76=arguments;_0x2760["\u0050\u0066\u0064\u0046\u005a\u0045"]=!![];}const _0x2a76ca=_0x276037[0x0];const _0x2c2511=_0x361324+_0x2a76ca;const _0x15a0df=_0x5b1a76[_0x2c2511];if(!_0x15a0df){_0x1b97a4=_0x2760["\u004d\u0079\u0047\u0050\u0045\u005a"](_0x1b97a4);_0x5b1a76[_0x2c2511]=_0x1b97a4;}else{_0x1b97a4=_0x15a0df;}return _0x1b97a4;};return _0x2760(_0x5b1a76,_0x5bb140);}function bOpyxb(_0x1c44b0,_0x2641af){if(!![]!=![])return;bOpyxb=function(_0x5cd033,_0x295d02){_0x5cd033=_0x5cd033-(0x973c9^0x973c9);var _0x55bdd8=_0x5e50e6[_0x5cd033];return _0x55bdd8;};return bOpyxb(_0x1c44b0,_0x2641af);}bOpyxb();const secretKey=_0x5d2e91(-0xe8,-0xe9,-0x103,-0xff,-0xf0);function _0x5d2e91(_0x36bfbc,_0x1e5582,_0x76b02a,_0x2c9581,_0x385211){return _0x2760(_0x385211- -0xf7,_0x2c9581);}const ivKey=_0x926599(-0x90,-0x7d,-0x8c,-0x7e,-0x80);export function encrypt(_0x2c8c63){return CryptoJS['AES']["\u0065\u006e\u0063\u0072\u0079\u0070\u0074"](_0x2c8c63,CryptoJS['enc']['Utf8']["\u0070\u0061\u0072\u0073\u0065"](secretKey),{'iv':CryptoJS['enc']["\u0055\u0074\u0066\u0038"]["\u0070\u0061\u0072\u0073\u0065"](ivKey)})["\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067"]();}function _0x926599(_0x3413e3,_0x1d46c0,_0x287abc,_0x3a926b,_0x43f7cb){return _0x2760(_0x1d46c0- -0x80,_0x3413e3);}export function decrypt(_0x1aed8e){const _0x138969=CryptoJS['AES']["\u0064\u0065\u0063\u0072\u0079\u0070\u0074"](_0x1aed8e,CryptoJS["\u0065\u006e\u0063"]['Utf8']["\u0070\u0061\u0072\u0073\u0065"](secretKey),{'iv':CryptoJS["\u0065\u006e\u0063"]["\u0055\u0074\u0066\u0038"]['parse'](ivKey)});return _0x138969["\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067"](CryptoJS['enc']['Utf8']);}
1
+ import CryptoJS from "crypto-js";
2
+
3
+ const secretKey = "2025202620272028"; // 密钥必须是16个字节
4
+ const ivKey = "2022202320242025"; // 向量必须是16个字节
5
+
6
+ // 加密函数
7
+ export function encrypt(text) {
8
+ return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(secretKey), {
9
+ iv: CryptoJS.enc.Utf8.parse(ivKey),
10
+ }).toString();
11
+ }
12
+
13
+ // 解密函数
14
+ export function decrypt(ciphertext) {
15
+ const bytes = CryptoJS.AES.decrypt(
16
+ ciphertext,
17
+ CryptoJS.enc.Utf8.parse(secretKey),
18
+ { iv: CryptoJS.enc.Utf8.parse(ivKey) }
19
+ );
20
+ return bytes.toString(CryptoJS.enc.Utf8);
21
+ }