cloud-web-corejs 1.0.54-dev.786 → 1.0.54-dev.787

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 (121) hide show
  1. package/package.json +2 -1
  2. package/src/components/VabUpload/index.vue +1 -1
  3. package/src/components/excelImport/index.js +69 -7
  4. package/src/components/excelImport/mixins.js +841 -9
  5. package/src/components/fileLibrary/fileHistoryDialog.vue +1 -1
  6. package/src/components/fileLibrary/fileObjAuthEdit.vue +1 -1
  7. package/src/components/fileLibrary/filterDialog.vue +1 -1
  8. package/src/components/formDialog/README.md +324 -241
  9. package/src/components/formDialog/actionButtons.js +90 -0
  10. package/src/components/formDialog/index.js +48 -35
  11. package/src/components/formDialog/index.vue +802 -724
  12. package/src/components/formDrawer/drawer.vue +719 -0
  13. package/src/components/formDrawer/index.js +50 -0
  14. package/src/components/onlineTalk/talkUserDialog.vue +1 -1
  15. package/src/components/tempStorage/tempStorageDialog.vue +1 -1
  16. package/src/components/wf/addTaskUserdialog.vue +1 -1
  17. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +1 -1
  18. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +115 -4
  19. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +102 -5
  20. package/src/components/xform/form-designer/form-widget/dialog/formFieldDialog.vue +1 -1
  21. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +1 -1
  22. package/src/components/xform/form-designer/setting-panel/action-button-config-dialog.vue +241 -0
  23. package/src/components/xform/form-designer/setting-panel/form-setting.vue +116 -0
  24. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-editor.vue +6 -0
  25. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +1 -0
  26. package/src/components/xform/form-render/container-item/data-table-mixin.js +1460 -1460
  27. package/src/components/xform/form-render/container-item/detail-item.vue +11 -2
  28. package/src/components/xform/form-render/indexMixin.js +5 -0
  29. package/src/index.js +506 -472
  30. package/src/utils/lazyPlugin.js +66 -0
  31. package/src/views/bd/setting/bd_attach_setting/dialog.vue +1 -1
  32. package/src/views/bd/setting/bd_attach_setting/list.vue +1 -1
  33. package/src/views/bd/setting/bd_company_env/dialog.vue +1 -1
  34. package/src/views/bd/setting/bd_company_env/list.vue +1 -1
  35. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +1 -1
  36. package/src/views/bd/setting/form_import_log/list.vue +1 -1
  37. package/src/views/bd/setting/form_script/dialog.vue +1 -1
  38. package/src/views/bd/setting/form_script/form_list.vue +1 -1
  39. package/src/views/bd/setting/form_script/list.vue +1 -1
  40. package/src/views/bd/setting/form_script/list1.vue +1 -1
  41. package/src/views/bd/setting/form_template/dialog.vue +1 -1
  42. package/src/views/bd/setting/form_template/ftHistoryDialog.vue +1 -1
  43. package/src/views/bd/setting/form_template/itemList.vue +1 -1
  44. package/src/views/bd/setting/form_template/list.vue +1 -1
  45. package/src/views/bd/setting/form_template/wf_list.vue +1 -1
  46. package/src/views/bd/setting/logic_param/list.vue +1 -1
  47. package/src/views/bd/setting/menu_kind/dialog.vue +1 -1
  48. package/src/views/bd/setting/menu_kind/list.vue +1 -1
  49. package/src/views/bd/setting/push_data/list.vue +1 -1
  50. package/src/views/bd/setting/push_data_h/list.vue +1 -1
  51. package/src/views/bd/setting/request_async_setting/list.vue +1 -1
  52. package/src/views/bd/setting/request_setting/list.vue +1 -1
  53. package/src/views/bd/setting/table_model/dialog.vue +1 -1
  54. package/src/views/bd/setting/table_model/list.vue +1 -1
  55. package/src/views/bd/setting/table_model/zdDialog.vue +1 -1
  56. package/src/views/support/export_template/list.vue +1 -1
  57. package/src/views/user/access_log/list.vue +1 -1
  58. package/src/views/user/access_log/list2.vue +1 -1
  59. package/src/views/user/api_request/list.vue +1 -1
  60. package/src/views/user/area/dialog.vue +1 -1
  61. package/src/views/user/area/list.vue +1 -1
  62. package/src/views/user/bill_setting/list.vue +1 -1
  63. package/src/views/user/bill_setting/userDialog.vue +1 -1
  64. package/src/views/user/code_rules/list.vue +1 -1
  65. package/src/views/user/common_attribute/list.vue +1 -1
  66. package/src/views/user/common_script/list.vue +1 -1
  67. package/src/views/user/company_info/dialog.vue +1 -1
  68. package/src/views/user/country/dialog.vue +1 -1
  69. package/src/views/user/country/list.vue +1 -1
  70. package/src/views/user/data_type_setting/dialog.vue +1 -1
  71. package/src/views/user/extend_datasource/dialog.vue +1 -1
  72. package/src/views/user/extend_datasource/list.vue +1 -1
  73. package/src/views/user/fieldTranslation/list.vue +1 -1
  74. package/src/views/user/field_values_invisible/list.vue +1 -1
  75. package/src/views/user/file_type/list.vue +1 -1
  76. package/src/views/user/file_view_area/list.vue +1 -1
  77. package/src/views/user/form/form_template/dialog.vue +1 -1
  78. package/src/views/user/form/form_template/itemList.vue +1 -1
  79. package/src/views/user/form/form_template/list.vue +1 -1
  80. package/src/views/user/form/form_template_field/dialog.vue +1 -1
  81. package/src/views/user/form/form_type/dialog.vue +1 -1
  82. package/src/views/user/form/form_type/list.vue +1 -1
  83. package/src/views/user/form/report_requestaccess/dialog.vue +1 -1
  84. package/src/views/user/form/report_requestaccess/list.vue +1 -1
  85. package/src/views/user/groups/dialog.vue +1 -1
  86. package/src/views/user/groups/list.vue +1 -1
  87. package/src/views/user/lang_tag/dialog.vue +1 -1
  88. package/src/views/user/lang_tag/list.vue +1 -1
  89. package/src/views/user/language_setting/list.vue +1 -1
  90. package/src/views/user/menu/list.vue +1 -1
  91. package/src/views/user/mobile_menu/list.vue +1 -1
  92. package/src/views/user/notify_message/list.vue +1 -1
  93. package/src/views/user/notify_template/list.vue +1 -1
  94. package/src/views/user/notify_template/list2.vue +1 -1
  95. package/src/views/user/oplog/list.vue +1 -1
  96. package/src/views/user/position/dialog.vue +1 -1
  97. package/src/views/user/position/list.vue +1 -1
  98. package/src/views/user/project_tag/dialog.vue +1 -1
  99. package/src/views/user/project_tag/list.vue +1 -1
  100. package/src/views/user/push_setting/list.vue +1 -1
  101. package/src/views/user/request_setting/list.vue +1 -1
  102. package/src/views/user/role/dialog.vue +1 -1
  103. package/src/views/user/role/list.vue +1 -1
  104. package/src/views/user/sale_org/dialog.vue +1 -1
  105. package/src/views/user/sale_org/list.vue +1 -1
  106. package/src/views/user/system_notice/list.vue +1 -1
  107. package/src/views/user/system_parameter/list.vue +1 -1
  108. package/src/views/user/user/dialog.vue +1 -1
  109. package/src/views/user/user/form_dialog.vue +1 -1
  110. package/src/views/user/user/form_list.vue +1 -1
  111. package/src/views/user/user/list.vue +2 -2
  112. package/src/views/user/user_log_classify/list.vue +1 -1
  113. package/src/views/user/wf/wfReport/index.vue +2 -2
  114. package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -2
  115. package/src/views/user/wf/wf_manage/list.vue +2 -2
  116. package/src/views/user/wf/wf_manage/list2.vue +2 -2
  117. package/src/views/user/wf/wf_obj_config/dialog.vue +1 -1
  118. package/src/views/user/wf/wf_obj_config/list.vue +1 -1
  119. package/src/views/user/wf/wf_obj_config/list_form.vue +1 -1
  120. package/src/views/user/wf/wf_transfer_setting/list.vue +1 -1
  121. package/src/views/user/workbench_menu/list.vue +1 -1
package/src/index.js CHANGED
@@ -1,472 +1,506 @@
1
- /**version-1.0*/
2
- import "./public-path"; // qiankun publicPath 修正,必须保持第一行
3
- import Vue from "vue";
4
- import Cookies from "js-cookie";
5
- import "normalize.css/normalize.css"; // a modern alternative to CSS resets
6
- import Element from "element-ui";
7
- import "@/styles/element-variables.scss";
8
- import "@/styles/index.scss"; // global css
9
-
10
- import App from "@base/App";
11
- import store from "@base/store";
12
- import router, { resetRouter } from "@base/router";
13
- import settings from "@/settings";
14
- import { setToken as setAuthToken } from "@base/utils/auth";
15
- import { loadViewComponent } from "@base/utils/resolveViewComponent";
16
-
17
- import "@/icons"; // icon
18
- import "@base/permission"; // permission control
19
-
20
- import * as filters from "@base/filters"; // global filters
21
-
22
- // main.js 文件添加以下代码
23
-
24
- import BaseKeepAlive from "@base/utils/keepAlive.js";
25
-
26
- Vue.component("BaseKeepAlive", BaseKeepAlive);
27
-
28
- import VXETable from "vxe-table";
29
- import "vxe-table/lib/style.css";
30
-
31
- // 引入扩展插件
32
- // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.es6.min.js";
33
- // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.min.css";
34
-
35
- /* // 设置授权信息
36
- VXETable.setup({
37
- // showAuthLog: true, // 是否在控制台显示授权信息,专业版支持关闭
38
- // authId: 'gbeumewkoyt2rhf9', // 获取授权后在官网登录后进入“用户中心”查看
39
- authId: 'gbeumewkoyt2rhft', // 获取授权后在官网登录后进入“用户中心”查看
40
- // onAuth (e) {
41
- // // 打印授权状态
42
- // console.log(e)
43
- // }
44
- }) */
45
-
46
- import Vab from "@base/utils/vab";
47
-
48
- Vue.use(Vab);
49
-
50
- // appCode 兜底派生:子应用(拥有自己的子命名空间,即 WEB_PREFIX !== MAIN_WEB_PREFIX)
51
- // 若未在自身 settings.js 里维护 appCode,则从 WEB_PREFIX 去前导斜杠派生(/mkweb → mkweb),
52
- // 免得每个子应用再手填一处、也不会写错。主应用/独立主站两前缀相同 → 保持空。
53
- // 优先级:mount 里的 props.appCode > settings 显式值 > 此派生。window.WEB_PREFIX /
54
- // MAIN_WEB_PREFIX 已由上面 vab 的 Object.assign(window, prefixConfig) 设好。
55
- if (!settings.appCode) {
56
- const webPrefix = window.WEB_PREFIX || "";
57
- const mainWebPrefix = window.MAIN_WEB_PREFIX || "";
58
- if (webPrefix && webPrefix !== mainWebPrefix) {
59
- settings.appCode = webPrefix.replace(/^\/+/, "");
60
- }
61
- }
62
-
63
- Vue.use(VXETable);
64
-
65
- /* import tablePluns from "@/mixins/table/index.js"
66
- VXETable.use(tablePluns) */
67
-
68
- import "@base/components/table/index.js";
69
-
70
- import drag from "@base/directive/el-drag-dialog/index.js";
71
-
72
- Vue.use(drag.install);
73
-
74
- import elDialogCenter from "@base/directive/el-dialog-center/index.js";
75
-
76
- Vue.use(elDialogCenter.install);
77
-
78
- import ErroreBox from "@base/components/errorMsg/index.js";
79
-
80
- Vue.use(ErroreBox);
81
-
82
- import ExcelExport from "@base/components/excelExport/index.js";
83
-
84
- Vue.use(ExcelExport);
85
-
86
- import ExcelImport from "@base/components/excelImport/index.js";
87
-
88
- Vue.use(ExcelImport);
89
-
90
- import ConfirmDialog from "@base/components/confirmDialog/index.js";
91
-
92
- Vue.use(ConfirmDialog);
93
-
94
- import baseAlert from "@base/components/baseAlert/index.js";
95
-
96
- Vue.use(baseAlert);
97
-
98
- import FormDialog from "@base/components/formDialog/index.js";
99
-
100
- Vue.use(FormDialog);
101
-
102
- import permission from "@base/directive/permission";
103
-
104
- Vue.use(permission);
105
-
106
- import VabUpload from "@base/components/VabUpload/index.js";
107
-
108
- Vue.use(VabUpload);
109
-
110
- Vue.component("baseUpload", () =>
111
- import("@base/components/VabUpload/view.vue")
112
- );
113
-
114
- import baseAttachment from "@base/components/baseAttachment/install";
115
-
116
- Vue.use(baseAttachment);
117
- Vue.component("attachmentShowList", () =>
118
- import("@base/components/baseAttachment/showList")
119
- );
120
-
121
- import "@base/resources/js/base/common.js";
122
-
123
- import vxeFilter from "@base/components/table/vxeFilter/index.js";
124
-
125
- Vue.use(vxeFilter);
126
-
127
- import baseTableExport from "@base/components/excelExport/button.vue";
128
-
129
- Vue.component(baseTableExport.name, baseTableExport);
130
-
131
- /* Vue.component('extendedProperties', () => import('@base/components/extendedProperties/view.vue')); */
132
-
133
- import LimitNumber from "@base/directive/LimitNumber/index.js";
134
-
135
- Vue.use(LimitNumber);
136
-
137
- import baseInputNumber from "@base/components/baseInputNumber/index.vue";
138
-
139
- Vue.component(baseInputNumber.name, baseInputNumber);
140
-
141
- import elReadonly from "@base/directive/el-readonly/index.js";
142
-
143
- Vue.use(elReadonly);
144
-
145
- /*import cnPrint from "@base/components/cnPrint/index.js"
146
-
147
- Vue.use(cnPrint);*/
148
-
149
- /* Vue.component('oplogTable', () => import('@base/components/oplogTable/index.vue')); */
150
- import oplogTable from "@base/components/oplogTable/index.vue";
151
-
152
- Vue.component(oplogTable.name, oplogTable);
153
-
154
- import baseInputBatch from "@base/components/baseInputBatch/index.vue";
155
-
156
- Vue.component(baseInputBatch.name, baseInputBatch);
157
-
158
- import baseArea from "@base/components/baseArea/index.vue";
159
-
160
- Vue.component(baseArea.name, baseArea);
161
-
162
- Vue.component("baseInputExport", () =>
163
- import("@base/components/baseInputExport/index.vue")
164
- );
165
-
166
- Vue.component("advancedSearchDialog", () =>
167
- import("@base/components/advancedSearchDialog/index.vue")
168
- );
169
-
170
- import baseTabs from "@base/components/baseTabs/index.vue";
171
-
172
- Vue.component(baseTabs.name, baseTabs);
173
-
174
- import baseTabPane from "@base/components/baseTabs/baseTabPane.vue";
175
-
176
- Vue.component(baseTabPane.name, baseTabPane);
177
-
178
- import vb_tabs from "@base/components/vb-tabs/index.vue";
179
- import vb_tab_pane from "@base/components/vb-tabs/tab-pane.vue";
180
- import xTabs from "@base/components/vb-tabs/x-tabs.vue";
181
-
182
- Vue.component(vb_tabs.name, vb_tabs);
183
- Vue.component(vb_tab_pane.name, vb_tab_pane);
184
- Vue.component(xTabs.name, xTabs);
185
-
186
- Vue.component("status-tag", () =>
187
- import("@base/components/statusTag/index.vue")
188
- );
189
-
190
- Vue.component("CodeEditor", () =>
191
- import("@base/components/code-editor/index.vue")
192
- );
193
-
194
- Vue.component("scriptDescriptionButton", () =>
195
- import("@base/components/scriptDescription/button")
196
- );
197
-
198
- Vue.component("scriptTestButton", () =>
199
- import("@base/components/scriptTest/button")
200
- );
201
-
202
- import baseTextarea from "@base/components/base-textarea/index.vue";
203
-
204
- Vue.component(baseTextarea.name, baseTextarea);
205
-
206
- import jsonImport from "@base/components/jsonImport/index.js";
207
-
208
- Vue.use(jsonImport);
209
-
210
- import langImport from "@base/components/langImport/index.js";
211
-
212
- Vue.use(langImport);
213
-
214
- //vform
215
- // import '@base/components/xform/utils/directive'
216
-
217
- import i18n from "@base/lang/index.js";
218
-
219
- /**
220
- * If you don't want to use mock-server
221
- * you want to use MockJs for mock api
222
- * you can execute: mockXHR()
223
- *
224
- * Currently MockJs will be used in the production environment,
225
- * please remove it before going online ! ! !
226
- */
227
- if (process.env.NODE_ENV === "production") {
228
- /* const { mockXHR } = require('../mock')
229
- mockXHR() */
230
- }
231
-
232
- Vue.use(Element, {
233
- size: Cookies.get("size") || "medium", // set element-ui default size
234
- // locale: enLang // 如果使用中文,无需设置,请删除
235
- });
236
-
237
- // register global utility filters
238
- Object.keys(filters).forEach((key) => {
239
- Vue.filter(key, filters[key]);
240
- });
241
-
242
- // 详情承载宿主:弹框 remote 分支用它 loadMicroApp 装载归属子应用渲染私有详情页
243
- Vue.component("micro-view-host", () =>
244
- import("@base/components/micro-view-host/index.vue")
245
- );
246
-
247
- Vue.config.productionTip = false;
248
-
249
- let instance = null;
250
-
251
- function render(props = {}) {
252
- const { container } = props;
253
- instance = new Vue({
254
- router,
255
- store,
256
- i18n,
257
- render: (h) => h(App),
258
- }).$mount(container ? container.querySelector("#app") : "#app");
259
- window.$vueRoot = instance;
260
- }
261
-
262
- /**
263
- * 详情承载入口(qiankun 详情承载协议 §5.5)。
264
- * 主应用/渲染方的 micro-view-host 用 loadMicroApp 装载本应用并置 props.microDetailHost=true,
265
- * 要求只渲染 targetPath 指向的详情页、把详情页的刷新/关闭/回调桥接回主应用,不出整站壳。
266
- * 契约字段见 docs/qiankun详情承载子应用对接清单.md。
267
- *
268
- * parentVue shim 的委托语义需真机联调打磨:详情页 getTarget(this) 命中 shim 后会用到
269
- * $http/$message/$baseConfirm/$attrs 等——这些经原型委托到宿主根实例(全局插件已装齐),
270
- * 仅 $baseReload / _handleCallback 覆盖为回主应用的动作。个别详情页若有更深的 $parent 依赖,
271
- * 按对接清单 §5.6 做最小改造。
272
- */
273
- function mountDetailHost(props = {}) {
274
- if (props.appCode) settings.appCode = props.appCode;
275
- if (props.token) {
276
- setAuthToken(props.token);
277
- store.commit("user/SET_TOKEN", props.token);
278
- }
279
- if (props.lang) i18n.locale = props.lang;
280
-
281
- const appCode = props.appCode || settings.appCode;
282
- const resolved = loadViewComponent(props.targetPath, { appCode });
283
- const target = resolved.component;
284
- const bizParams = props.bizParams || {};
285
- const viewMeta = props.viewMeta || {};
286
-
287
- // shim 需先于 render 存在(作为 parentVue prop 传入),其 Vue 能力在挂载后经原型委托到根实例
288
- const shim = {
289
- $baseReload: () => props.onReload && props.onReload(),
290
- _handleCallback: (flag) => props.onHandleCallback && props.onHandleCallback(flag),
291
- };
292
-
293
- const { container } = props;
294
- const mountEl = container ? container.querySelector("#app") : "#app";
295
- instance = new Vue({
296
- store,
297
- i18n,
298
- render(h) {
299
- if (!target) {
300
- return h(
301
- "div",
302
- { staticClass: "micro-detail-host-missing" },
303
- "详情页组件未找到:" + (props.targetPath || "")
304
- );
305
- }
306
- return h(target, {
307
- props: Object.assign({}, bizParams, viewMeta, {
308
- parentVue: shim,
309
- _handleCallback: (flag) =>
310
- props.onHandleCallback && props.onHandleCallback(flag),
311
- outParam: props.initialOutParam,
312
- }),
313
- on: {
314
- reload: () => props.onReload && props.onReload(),
315
- close: () => props.onClose && props.onClose(),
316
- "update:outParam": (v) =>
317
- props.onUpdateOutParam && props.onUpdateOutParam(v),
318
- },
319
- });
320
- },
321
- }).$mount(mountEl);
322
- // #4 listeners 透传:详情页里父级 v-on="listeners" 那批是详情页直接 this.$emit 的,
323
- // 拦截根子组件的 $emit,任意事件都转发给主应用的 onEmit(按名字派回原 option.on)。
324
- const child = instance.$children && instance.$children[0];
325
- if (child && typeof child.$emit === "function") {
326
- const rawEmit = child.$emit.bind(child);
327
- child.$emit = (name, ...args) => {
328
- if (typeof props.onEmit === "function") props.onEmit(name, ...args);
329
- return rawEmit(name, ...args);
330
- };
331
- }
332
- // 挂载后把 shim 的原型指向根实例:$http/$message/$baseConfirm 等委托过去,
333
- // shim 自有的 $baseReload/_handleCallback 覆盖生效(详情页动作时才会调用)
334
- Object.setPrototypeOf(shim, instance);
335
- window.$vueRoot = instance;
336
- }
337
-
338
- if (!window.__POWERED_BY_QIANKUN__) {
339
- // 独立运行 / 主应用形态:行为与拆分前一致
340
- render();
341
- }
342
-
343
- /**
344
- * qiankun 子应用生命周期。
345
- * 引包子应用入口 re-export 即可:export * from "cloud-web-corejs/src/index";
346
- * 主子通信协议见 docs/qiankun微前端改造-实现方案.md 3.3。
347
- */
348
- export async function bootstrap() {}
349
-
350
- export async function mount(props = {}) {
351
- if (props.microDetailHost) {
352
- // 详情承载模式(micro-view-host 装载):不走整站壳/路由/菜单,
353
- // 只在容器里渲染 props.targetPath 指向的本应用组件。见对接清单文档。
354
- return mountDetailHost(props);
355
- }
356
- if (props.appCode) {
357
- // 主应用可经 props 覆盖,子应用也可在自身 settings.js 里声明
358
- settings.appCode = props.appCode;
359
- }
360
- if (props.token) {
361
- // token sessionStorage,按 origin 隔离——跨域/跨端口主应用的登录态子应用天然拿不到,
362
- // 主应用显式下发 token 即可免登(写入自身登录态后守卫按已登录走 getInfo2)
363
- setAuthToken(props.token);
364
- store.commit("user/SET_TOKEN", props.token);
365
- }
366
- store.commit("micro/SET_MICRO_CONTEXT", {
367
- appCode: props.appCode || settings.appCode,
368
- // 非数组(null/未传)= 自治嵌入模式:子应用自拉菜单、保留自身壳(micro store 据此置 selfManaged)
369
- menus: Array.isArray(props.menus) ? props.menus : null,
370
- mainAdapter: props.mainAdapter || null,
371
- // 主应用经本地调试覆盖装载:允许 URL 直达未配菜单的页面
372
- debug: !!props.microDebug,
373
- });
374
- // 再次挂载时 unmount 已重置路由,而 roles 仍在会使守卫跳过路由生成,这里主动补一次
375
- if (store.getters.roles && store.getters.roles.length > 0) {
376
- if (store.state.micro.selfManaged) {
377
- await store.dispatch("permission/generateRoutes2", {
378
- flag: store.state.user.userFlag,
379
- });
380
- } else {
381
- await store.dispatch(
382
- "permission/generateRoutesFromProps",
383
- props.menus || []
384
- );
385
- }
386
- }
387
- render(props);
388
- }
389
-
390
- /**
391
- * 保活协议(主应用 loadMicroApp 模式):
392
- * update({ microActive: false }) —— 容器被隐藏:暂停路由监听(守卫 next(false) +
393
- * ensureURL 置空,防止对主应用的 URL 变化做出反应、回写 URL 互相打架);
394
- * update({ microActive: true }) —— 容器重新显示:恢复监听并把当前 hash 同步进路由
395
- * (含主应用在隐藏期间切到本应用另一菜单的深导航场景)。
396
- */
397
- let pausedEnsureURL = null;
398
-
399
- function pauseSubRouter() {
400
- if (store.state.micro.routerPaused) return;
401
- store.commit("micro/SET_ROUTER_PAUSED", true);
402
- const history = router.history;
403
- if (history && typeof history.ensureURL === "function") {
404
- pausedEnsureURL = history.ensureURL;
405
- history.ensureURL = function () {};
406
- }
407
- }
408
-
409
- function resumeSubRouter() {
410
- if (store.state.micro.routerPaused) {
411
- store.commit("micro/SET_ROUTER_PAUSED", false);
412
- if (pausedEnsureURL) {
413
- router.history.ensureURL = pausedEnsureURL;
414
- pausedEnsureURL = null;
415
- }
416
- }
417
- syncSubRouter();
418
- }
419
-
420
- function syncSubRouter() {
421
- const current = window.location.hash.replace(/^#/, "") || "/";
422
- if (router.currentRoute.fullPath !== current) {
423
- // vue-router 3.0.2 的 push 不返回 Promise(3.1.0 才加),直接 .catch 会读到
424
- // undefined 抛错,且此调用发生在 qiankun update 生命周期内——异常会让 parcel 直接
425
- // died、后续所有 update(含页签刷新转发)失效。仅当 push 返回 Promise 时才吞异常。
426
- const nav = router.push(current);
427
- if (nav && typeof nav.catch === "function") {
428
- nav.catch(() => {});
429
- }
430
- }
431
- }
432
-
433
- /**
434
- * 主应用页签"刷新"转发过来时在子应用内部重建当前页组件。
435
- * 不能套用主应用那招(delCachedView + 跳 /redirect):子应用与主应用共用同一个
436
- * 浏览器 hash,跳 /redirect 会被主应用 afterEach 判成"离开子应用路由",
437
- * 容器随即隐藏并暂停子应用路由,重建被掐断——表现就是点刷新没反应。
438
- * 改为自增序号通知 AppMain 原地销毁重建,全程不碰 URL。
439
- */
440
- function refreshCurrentView() {
441
- store.commit("micro/BUMP_RELOAD_SEQ");
442
- }
443
-
444
- export async function update(props = {}) {
445
- if (props.microActive === false) {
446
- pauseSubRouter();
447
- } else if (props.microActive === true) {
448
- resumeSubRouter();
449
- }
450
- if (props.microRefresh) {
451
- refreshCurrentView();
452
- }
453
- }
454
-
455
- export async function unmount() {
456
- if (store.state.micro.routerPaused && pausedEnsureURL) {
457
- router.history.ensureURL = pausedEnsureURL;
458
- pausedEnsureURL = null;
459
- }
460
- if (instance) {
461
- instance.$destroy();
462
- if (instance.$el) {
463
- instance.$el.innerHTML = "";
464
- }
465
- instance = null;
466
- }
467
- if (window.$vueRoot) {
468
- window.$vueRoot = null;
469
- }
470
- store.commit("micro/CLEAR_MICRO_CONTEXT");
471
- resetRouter();
472
- }
1
+ /**version-1.0*/
2
+ import "./public-path"; // qiankun publicPath 修正,必须保持第一行
3
+ import Vue from "vue";
4
+ import Cookies from "js-cookie";
5
+ import "normalize.css/normalize.css"; // a modern alternative to CSS resets
6
+ import Element from "element-ui";
7
+ import "@/styles/element-variables.scss";
8
+ import "@/styles/index.scss"; // global css
9
+
10
+ import App from "@base/App";
11
+ import store from "@base/store";
12
+ import router, { resetRouter } from "@base/router";
13
+ import settings from "@/settings";
14
+ import { setToken as setAuthToken } from "@base/utils/auth";
15
+ import { loadViewComponent } from "@base/utils/resolveViewComponent";
16
+
17
+ import "@/icons"; // icon
18
+ import "@base/permission"; // permission control
19
+
20
+ import * as filters from "@base/filters"; // global filters
21
+
22
+ // main.js 文件添加以下代码
23
+
24
+ import BaseKeepAlive from "@base/utils/keepAlive.js";
25
+
26
+ Vue.component("BaseKeepAlive", BaseKeepAlive);
27
+
28
+ import VXETable from "vxe-table";
29
+ import "vxe-table/lib/style.css";
30
+
31
+ // 引入扩展插件
32
+ // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.es6.min.js";
33
+ // import "@base/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.min.css";
34
+
35
+ /* // 设置授权信息
36
+ VXETable.setup({
37
+ // showAuthLog: true, // 是否在控制台显示授权信息,专业版支持关闭
38
+ // authId: 'gbeumewkoyt2rhf9', // 获取授权后在官网登录后进入“用户中心”查看
39
+ authId: 'gbeumewkoyt2rhft', // 获取授权后在官网登录后进入“用户中心”查看
40
+ // onAuth (e) {
41
+ // // 打印授权状态
42
+ // console.log(e)
43
+ // }
44
+ }) */
45
+
46
+ import Vab from "@base/utils/vab";
47
+
48
+ Vue.use(Vab);
49
+
50
+ // appCode 兜底派生:子应用(拥有自己的子命名空间,即 WEB_PREFIX !== MAIN_WEB_PREFIX)
51
+ // 若未在自身 settings.js 里维护 appCode,则从 WEB_PREFIX 去前导斜杠派生(/mkweb → mkweb),
52
+ // 免得每个子应用再手填一处、也不会写错。主应用/独立主站两前缀相同 → 保持空。
53
+ // 优先级:mount 里的 props.appCode > settings 显式值 > 此派生。window.WEB_PREFIX /
54
+ // MAIN_WEB_PREFIX 已由上面 vab 的 Object.assign(window, prefixConfig) 设好。
55
+ if (!settings.appCode) {
56
+ const webPrefix = window.WEB_PREFIX || "";
57
+ const mainWebPrefix = window.MAIN_WEB_PREFIX || "";
58
+ if (webPrefix && webPrefix !== mainWebPrefix) {
59
+ settings.appCode = webPrefix.replace(/^\/+/, "");
60
+ }
61
+ }
62
+
63
+ Vue.use(VXETable);
64
+
65
+ /* import tablePluns from "@/mixins/table/index.js"
66
+ VXETable.use(tablePluns) */
67
+
68
+ import "@base/components/table/index.js";
69
+
70
+ import drag from "@base/directive/el-drag-dialog/index.js";
71
+
72
+ Vue.use(drag.install);
73
+
74
+ import elDialogCenter from "@base/directive/el-dialog-center/index.js";
75
+
76
+ Vue.use(elDialogCenter.install);
77
+
78
+ import ErroreBox from "@base/components/errorMsg/index.js";
79
+
80
+ Vue.use(ErroreBox);
81
+
82
+ import ExcelExport from "@base/components/excelExport/index.js";
83
+
84
+ Vue.use(ExcelExport);
85
+
86
+ // 首屏优化:excelImport 链上有 xlsx(~430KB min),改为首次调用时才加载(utils/lazyPlugin)
87
+ import { lazyPrototypePlugin } from "@base/utils/lazyPlugin";
88
+
89
+ Vue.use(
90
+ lazyPrototypePlugin(
91
+ () =>
92
+ import(
93
+ /* webpackChunkName: "excel-import" */ "@base/components/excelImport/index.js"
94
+ ),
95
+ [{ name: "$excelImport" }, { name: "$downloadImportTemplate" }]
96
+ )
97
+ );
98
+
99
+ import ConfirmDialog from "@base/components/confirmDialog/index.js";
100
+
101
+ Vue.use(ConfirmDialog);
102
+
103
+ import baseAlert from "@base/components/baseAlert/index.js";
104
+
105
+ Vue.use(baseAlert);
106
+
107
+ import FormDialog from "@base/components/formDialog/index.js";
108
+
109
+ Vue.use(FormDialog);
110
+
111
+ import FormDrawer from "@base/components/formDrawer/index.js";
112
+
113
+ Vue.use(FormDrawer);
114
+
115
+ import permission from "@base/directive/permission";
116
+
117
+ Vue.use(permission);
118
+
119
+ // 首屏优化:VabUpload 链上有 esdk-obs-browserjs(OBS SDK),改为首次调用时才加载
120
+ Vue.use(
121
+ lazyPrototypePlugin(
122
+ () =>
123
+ import(
124
+ /* webpackChunkName: "vab-upload" */ "@base/components/VabUpload/index.js"
125
+ ),
126
+ [
127
+ { name: "$baseUpload", methods: ["open", "upload"] },
128
+ { name: "$openFileLibraryDialog" },
129
+ ]
130
+ )
131
+ );
132
+
133
+ Vue.component("baseUpload", () =>
134
+ import("@base/components/VabUpload/view.vue")
135
+ );
136
+
137
+ import baseAttachment from "@base/components/baseAttachment/install";
138
+
139
+ Vue.use(baseAttachment);
140
+ Vue.component("attachmentShowList", () =>
141
+ import("@base/components/baseAttachment/showList")
142
+ );
143
+
144
+ import "@base/resources/js/base/common.js";
145
+
146
+ import vxeFilter from "@base/components/table/vxeFilter/index.js";
147
+
148
+ Vue.use(vxeFilter);
149
+
150
+ // 首屏优化:低频/非首屏组件转懒注册(名字与组件内 name 一致,写死字符串)
151
+ Vue.component("base-table-export", () =>
152
+ import("@base/components/excelExport/button.vue")
153
+ );
154
+
155
+ /* Vue.component('extendedProperties', () => import('@base/components/extendedProperties/view.vue')); */
156
+
157
+ import LimitNumber from "@base/directive/LimitNumber/index.js";
158
+
159
+ Vue.use(LimitNumber);
160
+
161
+ import baseInputNumber from "@base/components/baseInputNumber/index.vue";
162
+
163
+ Vue.component(baseInputNumber.name, baseInputNumber);
164
+
165
+ import elReadonly from "@base/directive/el-readonly/index.js";
166
+
167
+ Vue.use(elReadonly);
168
+
169
+ /*import cnPrint from "@base/components/cnPrint/index.js"
170
+
171
+ Vue.use(cnPrint);*/
172
+
173
+ Vue.component("oplogTable", () =>
174
+ import("@base/components/oplogTable/index.vue")
175
+ );
176
+
177
+ Vue.component("baseInputBatch", () =>
178
+ import("@base/components/baseInputBatch/index.vue")
179
+ );
180
+
181
+ Vue.component("baseArea", () => import("@base/components/baseArea/index.vue"));
182
+
183
+ Vue.component("baseInputExport", () =>
184
+ import("@base/components/baseInputExport/index.vue")
185
+ );
186
+
187
+ Vue.component("advancedSearchDialog", () =>
188
+ import("@base/components/advancedSearchDialog/index.vue")
189
+ );
190
+
191
+ Vue.component("baseTabs", () =>
192
+ import("@base/components/baseTabs/index.vue")
193
+ );
194
+
195
+ Vue.component("baseTabPane", () =>
196
+ import("@base/components/baseTabs/baseTabPane.vue")
197
+ );
198
+
199
+ import vb_tabs from "@base/components/vb-tabs/index.vue";
200
+ import vb_tab_pane from "@base/components/vb-tabs/tab-pane.vue";
201
+ import xTabs from "@base/components/vb-tabs/x-tabs.vue";
202
+
203
+ Vue.component(vb_tabs.name, vb_tabs);
204
+ Vue.component(vb_tab_pane.name, vb_tab_pane);
205
+ Vue.component(xTabs.name, xTabs);
206
+
207
+ Vue.component("status-tag", () =>
208
+ import("@base/components/statusTag/index.vue")
209
+ );
210
+
211
+ Vue.component("CodeEditor", () =>
212
+ import("@base/components/code-editor/index.vue")
213
+ );
214
+
215
+ Vue.component("scriptDescriptionButton", () =>
216
+ import("@base/components/scriptDescription/button")
217
+ );
218
+
219
+ Vue.component("scriptTestButton", () =>
220
+ import("@base/components/scriptTest/button")
221
+ );
222
+
223
+ Vue.component("BaseTextarea", () =>
224
+ import("@base/components/base-textarea/index.vue")
225
+ );
226
+
227
+ // 首屏优化:jsonImport/langImport 链上同样有 xlsx,改为首次调用时才加载
228
+ Vue.use(
229
+ lazyPrototypePlugin(
230
+ () =>
231
+ import(
232
+ /* webpackChunkName: "json-import" */ "@base/components/jsonImport/index.js"
233
+ ),
234
+ [{ name: "$jsonImport" }, { name: "$jsonExport" }]
235
+ )
236
+ );
237
+
238
+ Vue.use(
239
+ lazyPrototypePlugin(
240
+ () =>
241
+ import(
242
+ /* webpackChunkName: "lang-import" */ "@base/components/langImport/index.js"
243
+ ),
244
+ [{ name: "$langImport" }]
245
+ )
246
+ );
247
+
248
+ //vform
249
+ // import '@base/components/xform/utils/directive'
250
+
251
+ import i18n from "@base/lang/index.js";
252
+
253
+ /**
254
+ * If you don't want to use mock-server
255
+ * you want to use MockJs for mock api
256
+ * you can execute: mockXHR()
257
+ *
258
+ * Currently MockJs will be used in the production environment,
259
+ * please remove it before going online ! ! !
260
+ */
261
+ if (process.env.NODE_ENV === "production") {
262
+ /* const { mockXHR } = require('../mock')
263
+ mockXHR() */
264
+ }
265
+
266
+ Vue.use(Element, {
267
+ size: Cookies.get("size") || "medium", // set element-ui default size
268
+ // locale: enLang // 如果使用中文,无需设置,请删除
269
+ });
270
+
271
+ // register global utility filters
272
+ Object.keys(filters).forEach((key) => {
273
+ Vue.filter(key, filters[key]);
274
+ });
275
+
276
+ // 详情承载宿主:弹框 remote 分支用它 loadMicroApp 装载归属子应用渲染私有详情页
277
+ Vue.component("micro-view-host", () =>
278
+ import("@base/components/micro-view-host/index.vue")
279
+ );
280
+
281
+ Vue.config.productionTip = false;
282
+
283
+ let instance = null;
284
+
285
+ function render(props = {}) {
286
+ const { container } = props;
287
+ instance = new Vue({
288
+ router,
289
+ store,
290
+ i18n,
291
+ render: (h) => h(App),
292
+ }).$mount(container ? container.querySelector("#app") : "#app");
293
+ window.$vueRoot = instance;
294
+ }
295
+
296
+ /**
297
+ * 详情承载入口(qiankun 详情承载协议 §5.5)。
298
+ * 主应用/渲染方的 micro-view-host 用 loadMicroApp 装载本应用并置 props.microDetailHost=true,
299
+ * 要求只渲染 targetPath 指向的详情页、把详情页的刷新/关闭/回调桥接回主应用,不出整站壳。
300
+ * 契约字段见 docs/qiankun详情承载子应用对接清单.md。
301
+ *
302
+ * parentVue shim 的委托语义需真机联调打磨:详情页 getTarget(this) 命中 shim 后会用到
303
+ * $http/$message/$baseConfirm/$attrs 等——这些经原型委托到宿主根实例(全局插件已装齐),
304
+ * 仅 $baseReload / _handleCallback 覆盖为回主应用的动作。个别详情页若有更深的 $parent 依赖,
305
+ * 按对接清单 §5.6 做最小改造。
306
+ */
307
+ function mountDetailHost(props = {}) {
308
+ if (props.appCode) settings.appCode = props.appCode;
309
+ if (props.token) {
310
+ setAuthToken(props.token);
311
+ store.commit("user/SET_TOKEN", props.token);
312
+ }
313
+ if (props.lang) i18n.locale = props.lang;
314
+
315
+ const appCode = props.appCode || settings.appCode;
316
+ const resolved = loadViewComponent(props.targetPath, { appCode });
317
+ const target = resolved.component;
318
+ const bizParams = props.bizParams || {};
319
+ const viewMeta = props.viewMeta || {};
320
+
321
+ // shim 需先于 render 存在(作为 parentVue prop 传入),其 Vue 能力在挂载后经原型委托到根实例
322
+ const shim = {
323
+ $baseReload: () => props.onReload && props.onReload(),
324
+ _handleCallback: (flag) => props.onHandleCallback && props.onHandleCallback(flag),
325
+ };
326
+
327
+ const { container } = props;
328
+ const mountEl = container ? container.querySelector("#app") : "#app";
329
+ instance = new Vue({
330
+ store,
331
+ i18n,
332
+ render(h) {
333
+ if (!target) {
334
+ return h(
335
+ "div",
336
+ { staticClass: "micro-detail-host-missing" },
337
+ "详情页组件未找到:" + (props.targetPath || "")
338
+ );
339
+ }
340
+ return h(target, {
341
+ props: Object.assign({}, bizParams, viewMeta, {
342
+ parentVue: shim,
343
+ _handleCallback: (flag) =>
344
+ props.onHandleCallback && props.onHandleCallback(flag),
345
+ outParam: props.initialOutParam,
346
+ }),
347
+ on: {
348
+ reload: () => props.onReload && props.onReload(),
349
+ close: () => props.onClose && props.onClose(),
350
+ "update:outParam": (v) =>
351
+ props.onUpdateOutParam && props.onUpdateOutParam(v),
352
+ },
353
+ });
354
+ },
355
+ }).$mount(mountEl);
356
+ // #4 listeners 透传:详情页里父级 v-on="listeners" 那批是详情页直接 this.$emit 的,
357
+ // 拦截根子组件的 $emit,任意事件都转发给主应用的 onEmit(按名字派回原 option.on)。
358
+ const child = instance.$children && instance.$children[0];
359
+ if (child && typeof child.$emit === "function") {
360
+ const rawEmit = child.$emit.bind(child);
361
+ child.$emit = (name, ...args) => {
362
+ if (typeof props.onEmit === "function") props.onEmit(name, ...args);
363
+ return rawEmit(name, ...args);
364
+ };
365
+ }
366
+ // 挂载后把 shim 的原型指向根实例:$http/$message/$baseConfirm 等委托过去,
367
+ // shim 自有的 $baseReload/_handleCallback 覆盖生效(详情页动作时才会调用)
368
+ Object.setPrototypeOf(shim, instance);
369
+ window.$vueRoot = instance;
370
+ }
371
+
372
+ if (!window.__POWERED_BY_QIANKUN__) {
373
+ // 独立运行 / 主应用形态:行为与拆分前一致
374
+ render();
375
+ }
376
+
377
+ /**
378
+ * qiankun 子应用生命周期。
379
+ * 引包子应用入口 re-export 即可:export * from "cloud-web-corejs/src/index";
380
+ * 主子通信协议见 docs/qiankun微前端改造-实现方案.md 3.3。
381
+ */
382
+ export async function bootstrap() {}
383
+
384
+ export async function mount(props = {}) {
385
+ if (props.microDetailHost) {
386
+ // 详情承载模式(micro-view-host 装载):不走整站壳/路由/菜单,
387
+ // 只在容器里渲染 props.targetPath 指向的本应用组件。见对接清单文档。
388
+ return mountDetailHost(props);
389
+ }
390
+ if (props.appCode) {
391
+ // 主应用可经 props 覆盖,子应用也可在自身 settings.js 里声明
392
+ settings.appCode = props.appCode;
393
+ }
394
+ if (props.token) {
395
+ // token 存 sessionStorage,按 origin 隔离——跨域/跨端口主应用的登录态子应用天然拿不到,
396
+ // 主应用显式下发 token 即可免登(写入自身登录态后守卫按已登录走 getInfo2)
397
+ setAuthToken(props.token);
398
+ store.commit("user/SET_TOKEN", props.token);
399
+ }
400
+ store.commit("micro/SET_MICRO_CONTEXT", {
401
+ appCode: props.appCode || settings.appCode,
402
+ // 非数组(null/未传)= 自治嵌入模式:子应用自拉菜单、保留自身壳(micro store 据此置 selfManaged)
403
+ menus: Array.isArray(props.menus) ? props.menus : null,
404
+ mainAdapter: props.mainAdapter || null,
405
+ // 主应用经本地调试覆盖装载:允许 URL 直达未配菜单的页面
406
+ debug: !!props.microDebug,
407
+ });
408
+ // 再次挂载时 unmount 已重置路由,而 roles 仍在会使守卫跳过路由生成,这里主动补一次
409
+ if (store.getters.roles && store.getters.roles.length > 0) {
410
+ if (store.state.micro.selfManaged) {
411
+ await store.dispatch("permission/generateRoutes2", {
412
+ flag: store.state.user.userFlag,
413
+ });
414
+ } else {
415
+ await store.dispatch(
416
+ "permission/generateRoutesFromProps",
417
+ props.menus || []
418
+ );
419
+ }
420
+ }
421
+ render(props);
422
+ }
423
+
424
+ /**
425
+ * 保活协议(主应用 loadMicroApp 模式):
426
+ * update({ microActive: false }) —— 容器被隐藏:暂停路由监听(守卫 next(false) +
427
+ * ensureURL 置空,防止对主应用的 URL 变化做出反应、回写 URL 互相打架);
428
+ * update({ microActive: true }) —— 容器重新显示:恢复监听并把当前 hash 同步进路由
429
+ * (含主应用在隐藏期间切到本应用另一菜单的深导航场景)。
430
+ */
431
+ let pausedEnsureURL = null;
432
+
433
+ function pauseSubRouter() {
434
+ if (store.state.micro.routerPaused) return;
435
+ store.commit("micro/SET_ROUTER_PAUSED", true);
436
+ const history = router.history;
437
+ if (history && typeof history.ensureURL === "function") {
438
+ pausedEnsureURL = history.ensureURL;
439
+ history.ensureURL = function () {};
440
+ }
441
+ }
442
+
443
+ function resumeSubRouter() {
444
+ if (store.state.micro.routerPaused) {
445
+ store.commit("micro/SET_ROUTER_PAUSED", false);
446
+ if (pausedEnsureURL) {
447
+ router.history.ensureURL = pausedEnsureURL;
448
+ pausedEnsureURL = null;
449
+ }
450
+ }
451
+ syncSubRouter();
452
+ }
453
+
454
+ function syncSubRouter() {
455
+ const current = window.location.hash.replace(/^#/, "") || "/";
456
+ if (router.currentRoute.fullPath !== current) {
457
+ // vue-router 3.0.2 push 不返回 Promise(3.1.0 才加),直接 .catch 会读到
458
+ // undefined 抛错,且此调用发生在 qiankun update 生命周期内——异常会让 parcel 直接
459
+ // died、后续所有 update(含页签刷新转发)失效。仅当 push 返回 Promise 时才吞异常。
460
+ const nav = router.push(current);
461
+ if (nav && typeof nav.catch === "function") {
462
+ nav.catch(() => {});
463
+ }
464
+ }
465
+ }
466
+
467
+ /**
468
+ * 主应用页签"刷新"转发过来时在子应用内部重建当前页组件。
469
+ * 不能套用主应用那招(delCachedView + 跳 /redirect):子应用与主应用共用同一个
470
+ * 浏览器 hash,跳 /redirect 会被主应用 afterEach 判成"离开子应用路由",
471
+ * 容器随即隐藏并暂停子应用路由,重建被掐断——表现就是点刷新没反应。
472
+ * 改为自增序号通知 AppMain 原地销毁重建,全程不碰 URL。
473
+ */
474
+ function refreshCurrentView() {
475
+ store.commit("micro/BUMP_RELOAD_SEQ");
476
+ }
477
+
478
+ export async function update(props = {}) {
479
+ if (props.microActive === false) {
480
+ pauseSubRouter();
481
+ } else if (props.microActive === true) {
482
+ resumeSubRouter();
483
+ }
484
+ if (props.microRefresh) {
485
+ refreshCurrentView();
486
+ }
487
+ }
488
+
489
+ export async function unmount() {
490
+ if (store.state.micro.routerPaused && pausedEnsureURL) {
491
+ router.history.ensureURL = pausedEnsureURL;
492
+ pausedEnsureURL = null;
493
+ }
494
+ if (instance) {
495
+ instance.$destroy();
496
+ if (instance.$el) {
497
+ instance.$el.innerHTML = "";
498
+ }
499
+ instance = null;
500
+ }
501
+ if (window.$vueRoot) {
502
+ window.$vueRoot = null;
503
+ }
504
+ store.commit("micro/CLEAR_MICRO_CONTEXT");
505
+ resetRouter();
506
+ }