cloud-web-corejs 1.0.258 → 1.0.259
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +32 -25
- package/src/components/VabUpload/fileLibraryDialog.vue +296 -0
- package/src/components/VabUpload/index.js +22 -2
- package/src/components/VabUpload/index.vue +242 -231
- package/src/components/VabUpload/mixins/fileLibraryDialog.js +1112 -0
- package/src/components/VabUpload/mixins.js +1971 -1829
- package/src/components/VabUpload/privateProfileDialog.vue +2 -2
- package/src/components/baseArea/index.vue +1628 -0
- package/src/components/baseInputExport/mixins.js +48 -31
- package/src/components/baseInputNumber/index.vue +9 -9
- package/src/components/baseTabs/index.vue +16 -8
- package/src/components/code-editor/async.js +29 -0
- package/src/components/code-editor/index.vue +93 -4
- package/src/components/errorMsg/index.js +10 -9
- package/src/components/errorMsg/mixins.js +25 -23
- package/src/components/excelExport/exportFieldDialog.vue +40 -18
- package/src/components/excelExport/index.js +62 -3
- package/src/components/excelExport/index.vue +2 -1
- package/src/components/excelExport/mixins.js +496 -340
- package/src/components/excelImport/index.js +69 -7
- package/src/components/excelImport/mixins.js +841 -9
- package/src/components/fileLibrary/categoryMoveDialog.vue +109 -109
- package/src/components/fileLibrary/fileHistoryDialog.vue +1 -1
- package/src/components/fileLibrary/fileObjAuthDialog.vue +297 -298
- package/src/components/fileLibrary/fileObjAuthEdit.vue +1 -1
- package/src/components/fileLibrary/filterDialog.vue +1 -1
- package/src/components/fileLibrary/index.vue +1109 -1110
- package/src/components/fileLibrary/mixins/indexMixins.js +10 -0
- package/src/components/fileLibrary/propertiesDialog.vue +190 -190
- package/src/components/fileLibrary/recycleBinDialog.vue +237 -236
- package/src/components/formOplog/mixins.js +85 -80
- package/src/components/hiprint/view/design/index.vue +7 -2
- package/src/components/jsonImport/exportUtil.js +106 -0
- package/src/components/jsonImport/index.js +75 -50
- package/src/components/jsonImport/mixins.js +350 -348
- package/src/components/langImport/mixins.js +502 -500
- package/src/components/micro-view-host/contract.js +66 -0
- package/src/components/micro-view-host/index.vue +148 -0
- package/src/components/mobile/file/index.vue +10 -0
- package/src/components/mobile/wf/mixins/wfModifyDialogMixin.js +51 -47
- package/src/components/obsUpload/index.vue +234 -231
- package/src/components/obsUpload/mixins.js +1542 -1476
- package/src/components/onlineTalk/talkUserDialog.vue +1 -1
- package/src/components/table/CellSlot.vue +12 -10
- package/src/components/table/config.js +74 -1
- package/src/components/table/index.js +1208 -1
- package/src/components/table/tableFormMixin.js +285 -1
- package/src/components/table/util/index.js +38 -40
- package/src/components/table/vxeFilter/index.js +153 -2
- package/src/components/table/vxeFilter/mixin.js +305 -3
- package/src/components/tempStorage/tempStorageDialog.vue +1 -1
- package/src/components/vb-tabs/x-tabs.vue +10 -5
- package/src/components/wf/addTaskUserdialog.vue +1 -1
- package/src/components/wf/mixins/setCandidateDialog.js +217 -217
- package/src/components/wf/mixins/setCandidateDialog2.js +252 -252
- package/src/components/wf/wf.js +2224 -2203
- package/src/components/wf/wfUtil.js +2 -1
- package/src/components/xform/docs/2026-08 /345/210/227/350/241/250/345/257/274/345/207/272/350/204/261/346/225/217/345/210/227/345/211/224/351/231/244/350/220/275/345/234/260/346/226/207/346/241/243.md" +173 -0
- package/src/components/xform/form-designer/designer.js +1 -0
- package/src/components/xform/form-designer/form-widget/container-widget/containerMixin.js +110 -1
- package/src/components/xform/form-designer/form-widget/container-widget/data-table-mixin.js +282 -1
- package/src/components/xform/form-designer/form-widget/field-widget/area-select-widget.vue +272 -0
- package/src/components/xform/form-designer/form-widget/field-widget/autocomplete-widget.vue +119 -0
- package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +14 -0
- package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +18 -73
- package/src/components/xform/form-designer/form-widget/field-widget/mixins/autocomplete-mixin.js +451 -0
- package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +157 -0
- package/src/components/xform/form-designer/form-widget/field-widget/mixins/utc-transform-mixin.js +75 -0
- package/src/components/xform/form-designer/form-widget/field-widget/save_submit_wf_button-widget.vue +112 -0
- package/src/components/xform/form-designer/form-widget/field-widget/script-input-widget.vue +149 -0
- package/src/components/xform/form-designer/form-widget/indexMixin.js +179 -1
- package/src/components/xform/form-designer/indexMixin.js +823 -1
- package/src/components/xform/form-designer/refMixinDesign.js +27 -1
- package/src/components/xform/form-designer/setting-panel/action-button-config-dialog.vue +241 -0
- package/src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue +601 -0
- package/src/components/xform/form-designer/setting-panel/form-setting.vue +6 -0
- package/src/components/xform/form-designer/setting-panel/index.vue +314 -309
- package/src/components/xform/form-designer/setting-panel/indexMixin.js +324 -1
- package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +8 -7
- package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +8 -7
- package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +344 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +2 -2
- package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaDataType-editor.vue +25 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaMinLevel-editor.vue +50 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaName-editor.vue +20 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-autocomplete/autocomplete-vabSearchName-editor.vue +199 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-baseAttachment/baseAttachment-fileTypes-editor.vue +23 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-cascader/showAllLevels-editor.vue +21 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-dateLimit-editor.vue +157 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-script-input/script-input-editor.vue +55 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/field-vabUpload/vabUpload-fileTypes-editor.vue +23 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesEditorMixin.js +116 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/fileTypesSelect.vue +176 -0
- package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +3 -3
- package/src/components/xform/form-designer/setting-panel/property-editor/utcTransformEnabled-editor.vue +19 -0
- package/src/components/xform/form-designer/setting-panel/widgetPropertyDialogMixin.js +186 -0
- package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +566 -1
- package/src/components/xform/form-designer/widget-panel/indexMixin.js +290 -1
- package/src/components/xform/form-render/compareDelList.vue +83 -0
- package/src/components/xform/form-render/compareView.vue +76 -0
- package/src/components/xform/form-render/container-item/containerItemMixin.js +378 -1
- package/src/components/xform/form-render/container-item/data-table-mixin.js +35 -0
- package/src/components/xform/form-render/container-item/detail-item.vue +41 -0
- package/src/components/xform/form-render/container-item/dynamicFieldEngine.js +285 -0
- package/src/components/xform/form-render/container-item/dynamicFieldMixin.js +416 -0
- package/src/components/xform/form-render/container-item/list-h5-item.vue +12 -0
- package/src/components/xform/form-render/dynamicDialogRender.js +195 -1
- package/src/components/xform/form-render/dynamicDrawerRender.js +229 -0
- package/src/components/xform/form-render/formDynamicFieldMixin.js +131 -0
- package/src/components/xform/form-render/refMixin.js +29 -1
- package/src/components/xform/mixins/scriptHttp.js +172 -1
- package/src/components/xform/utils/dynamicSchemaUtil.js +361 -0
- package/src/components/xform/utils/tableCellValidateUtil.js +148 -0
- package/src/components/xform/utils/textMaskUtil.js +179 -0
- package/src/components/xform/utils/treeTableUtil.js +1265 -0
- package/src/components/xform/utils/util.js +1 -0
- package/src/components/xform/utils/validators.js +133 -1
- package/src/directive/LimitNumber/index.js +143 -124
- package/src/microRouter/index.js +447 -0
- package/src/mixins/tableTree/index.js +77 -14
- package/src/permission.js +132 -107
- package/src/public-path.js +38 -0
- package/src/router/index.js +3 -3
- package/src/store/modules/micro.js +57 -0
- package/src/store/modules/permission.js +535 -371
- package/src/store/modules/tagsView.js +38 -21
- package/src/store/modules/user.js +409 -370
- package/src/utils/aes.js +9 -3
- package/src/utils/auth.js +1 -1
- package/src/utils/componentDialog.js +162 -40
- package/src/utils/global.js +35 -34
- package/src/utils/index.js +579 -579
- package/src/utils/keepAlive.js +8 -4
- package/src/utils/lazyPlugin.js +66 -0
- package/src/utils/menuAdapter.js +277 -0
- package/src/utils/repeatOpen.js +48 -0
- package/src/utils/request.js +417 -395
- package/src/utils/resolveViewComponent.js +203 -0
- package/src/utils/vab.js +14 -3
- package/src/utils/validate.js +104 -106
- package/src/views/bd/setting/bd_attach_setting/dialog.vue +1 -1
- package/src/views/bd/setting/bd_attach_setting/list.vue +1 -1
- package/src/views/bd/setting/bd_company_env/dialog.vue +1 -1
- package/src/views/bd/setting/bd_company_env/list.vue +1 -1
- package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +488 -489
- package/src/views/bd/setting/form_import_log/list.vue +1 -1
- package/src/views/bd/setting/form_script/dialog.vue +1 -1
- package/src/views/bd/setting/form_script/form_list.vue +174 -166
- package/src/views/bd/setting/form_script/list.vue +1 -1
- package/src/views/bd/setting/form_script/list1.vue +1 -1
- package/src/views/bd/setting/form_script/mixins/form_list.js +330 -322
- package/src/views/bd/setting/form_template/dialog.vue +1 -1
- package/src/views/bd/setting/form_template/formDesignerDialog.vue +172 -171
- package/src/views/bd/setting/form_template/ftHistoryDialog.vue +1 -1
- package/src/views/bd/setting/form_template/itemList.vue +1 -1
- package/src/views/bd/setting/form_template/list.vue +3 -3
- package/src/views/bd/setting/form_template/mixins/edit.js +3 -3
- package/src/views/bd/setting/form_template/mixins/list.js +3 -3
- package/src/views/bd/setting/form_template/mixins/list2.js +3 -3
- package/src/views/bd/setting/form_template/mixins/wf_list.js +3 -3
- package/src/views/bd/setting/form_template/wfObjConfigDialog.vue +253 -254
- package/src/views/bd/setting/form_template/wf_list.vue +3 -3
- package/src/views/bd/setting/logic_param/edit.vue +20 -20
- package/src/views/bd/setting/logic_param/list.vue +1 -1
- package/src/views/bd/setting/menu_kind/dialog.vue +1 -1
- package/src/views/bd/setting/menu_kind/list.vue +1 -1
- package/src/views/bd/setting/push_data/list.vue +1 -1
- package/src/views/bd/setting/push_data_h/list.vue +1 -1
- package/src/views/bd/setting/request_async_setting/list.vue +1 -1
- package/src/views/bd/setting/request_setting/list.vue +1 -1
- package/src/views/bd/setting/table_model/dialog.vue +1 -1
- package/src/views/bd/setting/table_model/list.vue +1 -1
- package/src/views/bd/setting/table_model/zdDialog.vue +1 -1
- package/src/views/user/access_log/list.vue +1 -1
- package/src/views/user/access_log/list2.vue +1 -1
- package/src/views/user/api_request/list.vue +1 -1
- package/src/views/user/area/dialog.vue +1 -1
- package/src/views/user/area/list.vue +1 -1
- package/src/views/user/bill_setting/list.vue +1 -1
- package/src/views/user/bill_setting/userDialog.vue +1 -1
- package/src/views/user/code_rules/list.vue +1 -1
- package/src/views/user/commMenu/index.vue +2 -2
- package/src/views/user/common_attribute/list.vue +2 -2
- package/src/views/user/common_script/list.vue +1 -1
- package/src/views/user/company_info/dialog.vue +1 -1
- package/src/views/user/country/dialog.vue +1 -1
- package/src/views/user/country/list.vue +1 -1
- package/src/views/user/data_type_setting/dialog.vue +1 -1
- package/src/views/user/extend_datasource/dialog.vue +4 -1
- package/src/views/user/extend_datasource/edit.vue +2 -1
- package/src/views/user/extend_datasource/list.vue +4 -1
- package/src/views/user/fieldTranslation/list.vue +1 -1
- package/src/views/user/field_values_invisible/list.vue +1 -1
- package/src/views/user/file_type/list.vue +1 -1
- package/src/views/user/file_view_area/list.vue +1 -1
- package/src/views/user/file_view_ins/list.vue +22 -1
- package/src/views/user/form/view/list.vue +64 -1
- package/src/views/user/groups/dialog.vue +1 -1
- package/src/views/user/groups/list.vue +1 -1
- package/src/views/user/home/default.vue +2 -2
- package/src/views/user/home/default2.vue +1158 -1148
- package/src/views/user/home/index.vue +3 -10
- package/src/views/user/lang_tag/dialog.vue +1 -1
- package/src/views/user/lang_tag/list.vue +1 -1
- package/src/views/user/language_setting/list.vue +1 -1
- package/src/views/user/login/default.vue +0 -8
- package/src/views/user/login/indexMixin.js +547 -556
- package/src/views/user/menu/list.vue +25 -2
- package/src/views/user/menuFallback/index.vue +123 -0
- package/src/views/user/mobile_menu/list.vue +1 -1
- package/src/views/user/notify_message/dialog.vue +22 -1
- package/src/views/user/notify_message/list.vue +1 -1
- package/src/views/user/notify_template/list.vue +1 -1
- package/src/views/user/notify_template/list2.vue +1 -1
- package/src/views/user/oplog/list.vue +1 -1
- package/src/views/user/outLink/form_view.vue +5 -14
- package/src/views/user/outLink/index.vue +6 -1
- package/src/views/user/outLink/view.vue +5 -13
- package/src/views/user/position/dialog.vue +1 -1
- package/src/views/user/position/list.vue +1 -1
- package/src/views/user/project_tag/dialog.vue +1 -1
- package/src/views/user/project_tag/list.vue +1 -1
- package/src/views/user/push_setting/list.vue +1 -1
- package/src/views/user/request_setting/list.vue +1 -1
- package/src/views/user/role/dialog.vue +1 -1
- package/src/views/user/role/list.vue +1 -1
- package/src/views/user/sale_org/dialog.vue +1 -1
- package/src/views/user/sale_org/list.vue +1 -1
- package/src/views/user/system_notice/list.vue +1 -1
- package/src/views/user/system_parameter/list.vue +1 -1
- package/src/views/user/user/dialog.vue +1 -1
- package/src/views/user/user/edit.vue +306 -159
- package/src/views/user/user/form_dialog.vue +1 -1
- package/src/views/user/user/form_list.vue +1 -1
- package/src/views/user/user/list.vue +2 -2
- package/src/views/user/user_log_classify/list.vue +1 -1
- package/src/views/user/wf/iframe/index.vue +6 -1
- package/src/views/user/wf/iframe/index2.vue +6 -1
- package/src/views/user/wf/wfReport/index.vue +12 -6
- package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -2
- package/src/views/user/wf/wf_manage/list.vue +97 -24
- package/src/views/user/wf/wf_manage/list2.vue +875 -0
- package/src/views/user/wf/wf_manage/wfContentDialog.vue +23 -1
- package/src/views/user/wf/wf_obj_config/dialog.vue +1 -1
- package/src/views/user/wf/wf_obj_config/list.vue +1 -1
- package/src/views/user/wf/wf_obj_config/list_form.vue +1 -1
- package/src/views/user/wf/wf_transfer_setting/list.vue +1 -1
- package/src/views/user/workbench_menu/list.vue +1 -1
|
@@ -141,7 +141,7 @@ f = async function (option) {
|
|
|
141
141
|
appendPrevChildDom(wfBtnRegion, dom);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
if (wfBtnRegion && showStartBtn && !hasWf && !option.hiddenAllButton) {
|
|
144
|
+
if (wfBtnRegion && showStartBtn && option.injectStartBtn !== false && !hasWf && !option.hiddenAllButton) {
|
|
145
145
|
let wfStartButtonName = configUtil.settingConfig.wfStartButtonName || this.$t2('流程启动', 'components.wf.wfStart');
|
|
146
146
|
let dom = new configUtil.Vue({
|
|
147
147
|
render: function (h) {
|
|
@@ -289,3 +289,4 @@ function appendPrevChildDom(parentDom, newDom) {
|
|
|
289
289
|
}
|
|
290
290
|
|
|
291
291
|
export const initWf = f;
|
|
292
|
+
export { openStartWfDialog };
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# 列表导出脱敏列剔除(2026-08)
|
|
2
|
+
|
|
3
|
+
> 起因:配置了「加密」(密文文本)的字段,页面显示 `138****1234`,导出 Excel 却是完整明文。
|
|
4
|
+
> 排查范围:`src/components/xform/**`、`src/components/excelExport/**`、`src/components/table/**`。
|
|
5
|
+
|
|
6
|
+
## 一、问题定性
|
|
7
|
+
|
|
8
|
+
「加密」是**纯前端展示遮罩**,不是数据加密:
|
|
9
|
+
|
|
10
|
+
- 配置入口:属性面板 `textFlag-editor.vue` → `options.userTextRuleEnabled` + `options.userTextRuleConfig[]`
|
|
11
|
+
- 单条规则 `{ serveName, companyCodes, roleCodes, type, encryptFormula }`,`type=1` 角色不匹配时脱敏、`type=2` 角色匹配时脱敏,`encryptFormula` 形如 `3*3`
|
|
12
|
+
- 改造前实现只有一处:`form-item-wrapper.vue` —— `created` → `initShowType()` 算出 `widgetTextFlag=2`,模板改渲染 `<span>{{ getShowValue() }}</span>`,`getShowValue()` → `getProcessText()` 做星号替换
|
|
13
|
+
|
|
14
|
+
**原始值始终完整存在于 `row[field]` / `fieldModel` 中**,遮罩只发生在渲染层。
|
|
15
|
+
|
|
16
|
+
## 二、根因:导出取值绕开渲染层
|
|
17
|
+
|
|
18
|
+
导出取值优先级(`excelExport/mixins.js:828 getExportCellValue`):
|
|
19
|
+
|
|
20
|
+
1. `column.params.exportVal`
|
|
21
|
+
2. **`column.slots.filterVal(params)`** ← 命中点
|
|
22
|
+
3. 无自定义渲染 → `row[field]`(有 `formatter` 则格式化)
|
|
23
|
+
4. 兜底 `getCellValue()`:挂载 vNode 渲染再爬 DOM
|
|
24
|
+
|
|
25
|
+
而 `data-table-mixin.js:1888` 对 `input / number / text / select / checkbox / radio / status / vabsearch / date / textarea / a-link / a-text` 这 12 类组件列统一注册了 `col.slots.filterVal`,函数体直接返回 `row[field]`(select/radio/checkbox 返回 optionLabel,vabsearch 返回 label 字段,date 返回格式化值)——**整条路径不碰 `form-item-wrapper`,不读 `widgetTextFlag`**。
|
|
26
|
+
|
|
27
|
+
这 12 类恰好是最常配脱敏的字段类型。副作用是不一致:不在这 12 类里的组件列(`slots.default = "widget"`,无 `filterVal`)走第 4 条兜底,会真实渲染 wrapper 并爬 DOM,**导出的反而是星号**。同一张表有的列明文、有的列打码,且非有意设计。
|
|
28
|
+
|
|
29
|
+
其它同源泄漏点:
|
|
30
|
+
|
|
31
|
+
| 路径 | 改造前 |
|
|
32
|
+
|---|---|
|
|
33
|
+
| 明细导出(`exportItemColumns`,`data-table-mixin.js:2406`) | 必明文:列只有 `field/title`,行数据后端原样返回 |
|
|
34
|
+
| 条件导出 / 全量导出 | 明文:`loopToDo` 分页拉后端原始行 → 同一个 `getExcelData` |
|
|
35
|
+
| H5 列表容器 `list-h5-item.vue` | 明文:独立 `exportData`,列带 `params.widget` 但无 `filterVal` |
|
|
36
|
+
| vxe 工具栏自带导出(`table/index.js` `exportConfig`) | 明文:vxe 用行原始值 |
|
|
37
|
+
| 列筛选下拉候选值(`vxeFilter/mixin.js`) | 明文(不属导出,本轮未处理) |
|
|
38
|
+
| 接口响应 / JS 内存 | 明文(需后端脱敏,前端不可解) |
|
|
39
|
+
|
|
40
|
+
## 三、方案选型
|
|
41
|
+
|
|
42
|
+
| 档位 | 做法 | 结论 |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| 1 | 前端一致性:给 `filterVal` 结果也套一层遮罩 | 未选。要同步改 4 处取值路径,且"导出打码值"对下游数据消费无意义 |
|
|
45
|
+
| **2** | **命中脱敏规则的列直接整列不导出** | **本次采用** |
|
|
46
|
+
| 3 | 后端按角色脱敏返回 / 提供脱敏导出接口 | 真正解法,本轮范围外。方案 1、2 都只是"看不见",不是"拿不到" |
|
|
47
|
+
|
|
48
|
+
方案 2 之所以成立:**所有导出(列表 / 条件 / 选择 / 明细)都必须先过 `exportFieldDialog`**(`mixins.js:133` 是唯一入口,`:1072` 回传 columns/leafColumns),而 `params.exportDisabled` 已被三处消费:
|
|
49
|
+
|
|
50
|
+
| 位置 | 效果 |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `exportFieldDialog.vue:95 filterNonDataExportColumns`(`:160` 调用) | 字段选择树里不出现该列,子列全没了则父分组也去掉 |
|
|
53
|
+
| `exportFieldDialog.vue:319 dialogConfirm→loopDo` | 生成表头 JSON 时跳过 |
|
|
54
|
+
| `excelExport/mixins.js:860 getExcelData` | 取数时过滤 `leafColumns` |
|
|
55
|
+
|
|
56
|
+
所以只要把标记打到列上即可一次收口,无需改任何取值逻辑。
|
|
57
|
+
|
|
58
|
+
> 曾评估过变体「保留表头、值置空」:需给通用 `excelExport` 新增 `exportMasked` 语义,且整列空白易被下游误读成"该记录无值",已否决。
|
|
59
|
+
|
|
60
|
+
## 四、改动清单
|
|
61
|
+
|
|
62
|
+
### 1. 新增 `src/components/xform/utils/textMaskUtil.js`
|
|
63
|
+
|
|
64
|
+
脱敏判定的**唯一实现**,渲染侧与导出侧共用(否则界面打码、导出放行必然漂移)。
|
|
65
|
+
|
|
66
|
+
| 导出 | 职责 |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `resolveTextMaskFlag(widgetOptions, ctx)` | 判定是否脱敏 + 带出命中的 `encryptFormula` |
|
|
69
|
+
| `compareToList(list1, list2)` | 编码列表匹配,空列表表示不限 |
|
|
70
|
+
| `hasTextMaskRule(widgetOptions)` | 是否配了有效规则(不代表当前用户命中) |
|
|
71
|
+
| `buildTextMaskContext(formRef, companyCode)` | 组装 `{ bdService, companyCode, roleCodeList }` |
|
|
72
|
+
| `markMaskedExportColumns($grid, ctx)` | 给命中列打 `params.exportDisabled`,并同步到明细导出列 |
|
|
73
|
+
|
|
74
|
+
判定逻辑逐行照搬原 `initShowType`,包括两个易被"优化"掉的细节:
|
|
75
|
+
|
|
76
|
+
- 规则列表**全遍历而非命中即止**,后置规则会覆盖前置结论;
|
|
77
|
+
- `encryptFormula` 只要 serveName/companyCodes 命中就赋值,与 masked 与否无关。
|
|
78
|
+
|
|
79
|
+
### 2. `form-item-wrapper.vue:676 initShowType`
|
|
80
|
+
|
|
81
|
+
保留两个早退外壳(`!!this.designer`、`isLoadEntity && !dataId`)与 `field.options.widgetTextFlag` 写回,中间判定改调 util。行为等价,净减 73 行。
|
|
82
|
+
|
|
83
|
+
`compareToList` 保留为薄封装委托 util —— 本包对外发布,不删以免破坏下游调用。
|
|
84
|
+
|
|
85
|
+
### 3. `data-table-mixin.js`
|
|
86
|
+
|
|
87
|
+
- `:3231 markMaskedColumnsForExport()` —— 3 行委托 util
|
|
88
|
+
- `:3245 exportData()` 入口调用
|
|
89
|
+
- `:253 mounted` 建列后 `$nextTick` 再调一次(见下节决策 3)
|
|
90
|
+
|
|
91
|
+
### 4. `list-h5-item.vue:1664 / :1671`
|
|
92
|
+
|
|
93
|
+
H5 列表容器有独立 `exportData`,同样处理。这是编码阶段才发现的第二条泄漏路径。
|
|
94
|
+
|
|
95
|
+
### 5. `components/table/index.js:580`
|
|
96
|
+
|
|
97
|
+
`exportConfig` 增加 `columnFilterMethod`,堵 vxe 工具栏自带导出旁路。
|
|
98
|
+
|
|
99
|
+
**行为变化**:原有的操作列、图片列等 `exportDisabled` 列也会从原生导出中消失。属修正,但需业务知晓。
|
|
100
|
+
|
|
101
|
+
### 6. `tests/unit/components/xform/textMaskUtil.spec.js`
|
|
102
|
+
|
|
103
|
+
17 个用例,覆盖规则匹配的各分支、fail-closed、自愈还原、分组表头递归、明细列对齐。
|
|
104
|
+
|
|
105
|
+
## 五、关键设计决策
|
|
106
|
+
|
|
107
|
+
**决策 1 —— 判定放在导出触发时,不放在建列时。**
|
|
108
|
+
`bdService` / `userRoleDTOs` 由异步接口填充(`form-render/indexMixin.js:458、479、498`),建列时可能尚未就绪。
|
|
109
|
+
|
|
110
|
+
**决策 2 —— 不做"上下文未就绪"的收紧判断(踩过坑,见第十节)。**
|
|
111
|
+
判定结论与渲染层严格一致即可:同一个 `resolveTextMaskFlag`、同一份用户上下文,且导出必然发生在单元格渲染之后(用户已经看到明文或密文)。**不要再引入任何"上下文是否就绪"的启发式**。
|
|
112
|
+
|
|
113
|
+
**决策 3 —— `mounted` 也标记一次。**
|
|
114
|
+
vxe 原生导出不走 `exportData()`,若只在导出入口标记,`columnFilterMethod` 会拿到一张没标记的列表,等于没堵。故建列后先按当时的上下文标记一次;此刻结论未必准,但只会"少防护"不会误伤,之后每次 `exportData` 会按最新上下文自愈修正。
|
|
115
|
+
|
|
116
|
+
**决策 4 —— 标记幂等且可自愈,用私有键区分归属。**
|
|
117
|
+
`exportDisabled` 也可能是 `isNonDataExportColumn`(`data-table-mixin.js:1710`)打的。若无差别地 `delete`,自愈会误放行操作列。故引入 `MASK_MARK_KEY = "exportDisabledByTextMask"`(`textMaskUtil.js:19`):
|
|
118
|
+
|
|
119
|
+
- 列本就带 `exportDisabled` 且无私有键 → 不接管,不打私有键
|
|
120
|
+
- 由本函数从无到有打上 → 同时写私有键
|
|
121
|
+
- 撤销时只在私有键存在时才删
|
|
122
|
+
|
|
123
|
+
## 六、覆盖范围
|
|
124
|
+
|
|
125
|
+
| 泄漏点 | 现状 |
|
|
126
|
+
|---|---|
|
|
127
|
+
| 列表导出 / 条件导出 / 选择导出 | ✅ 堵住 |
|
|
128
|
+
| H5 列表导出 | ✅ 堵住 |
|
|
129
|
+
| 明细导出 | ⚠️ 按 field 名对齐,见局限 L1 |
|
|
130
|
+
| vxe 工具栏原生导出 | ✅ 决策 3 + 改动 5 |
|
|
131
|
+
| 列筛选下拉候选值明文 | ❌ 未纳入(不属导出) |
|
|
132
|
+
| 接口响应 / JS 内存明文 | ❌ 需后端脱敏 |
|
|
133
|
+
| 打印 / PDF | 走 DOM,应是打码的,**未验证** |
|
|
134
|
+
| 单元格区域复制 | **未验证**,疑似明文 |
|
|
135
|
+
|
|
136
|
+
## 七、已知局限
|
|
137
|
+
|
|
138
|
+
- **L1**:明细导出列只有 `field/title`,只能按字段名匹配主表脱敏字段集合。明细独有字段、或明细导出脚本返回的字段名与主表不一致时,仍会明文导出。
|
|
139
|
+
- **L2**:动态列 / 行级 schema(`fieldSchemaMap`)下同列不同行配置可能不同,判定按列模板走;模板未配、个别行配了的情况会漏。
|
|
140
|
+
- **L3**:表单低代码脚本里直接读 `row.xxx`、或列上配了自定义 `params.exportVal` 的,不受影响。
|
|
141
|
+
- **L4**:脱敏是**列级**判定;将来若出现行级脱敏,本方案不适用。
|
|
142
|
+
- **L5**:`exportFieldDialog.addTableExportColumns()`(`:252`)会把勾选状态持久化到 `$grid.exportColumns`。脱敏列不在树里 → 记为 `export:false`。同一用户换成不脱敏角色后,该列默认不勾选,需手动勾一次。
|
|
143
|
+
|
|
144
|
+
## 八、验证情况
|
|
145
|
+
|
|
146
|
+
已验证:
|
|
147
|
+
|
|
148
|
+
- `npx jest`:13 套 157 个用例全过(新增 18 个)
|
|
149
|
+
- ESLint:新增文件 0 error;改动文件只剩改动前就存在的既有错误(全库 132 个,`npm run lint` 本就不通过)
|
|
150
|
+
|
|
151
|
+
**未做真机联调**,以下回归项待验:
|
|
152
|
+
|
|
153
|
+
1. 配了脱敏的字段列,四种导出(列表 / 条件 / 选择 / 明细)文件中均无该列;
|
|
154
|
+
2. 两种规则方向:`type=2 + 角色匹配`、`type=1 + 角色不匹配`;
|
|
155
|
+
3. 未配脱敏的列完全不受影响;
|
|
156
|
+
4. **分组表头 2 层 / 3 层下剔除叶子列后表头不错位**(`loopDo` 会重算 `colSpan/rowSpan`,本轮风险最高的一处);
|
|
157
|
+
5. 页面遮罩显示效果与改造前一致(验证 `initShowType` 重构无回归);
|
|
158
|
+
6. vxe 工具栏导出(若宿主开启了该按钮)。
|
|
159
|
+
|
|
160
|
+
## 九、联调发现的问题(2026-08-04,已修)
|
|
161
|
+
|
|
162
|
+
**现象**:配了规则后,部分用户看明文、部分看密文(符合预期),但**所有用户导出时该列都消失**。
|
|
163
|
+
|
|
164
|
+
**根因**:首版实现有一个 `isTextMaskContextReady(ctx)`,用 `ctx.bdService` 非空 + 角色列表非空当作"用户上下文已就绪"的判据,未就绪时 fail-closed 剔除整列。但 `bdService` 来自 `/form_develop/getBdService`(`indexMixin.js:489`),`res.objx` 在大量环境本就是空值 —— 于是 `contextReady` 恒为 false,凡配了规则的列对所有用户一律被剔除。
|
|
165
|
+
|
|
166
|
+
**修复**:删除 `isTextMaskContextReady`,`markMaskedExportColumns` 直接采用 `resolveTextMaskFlag` 的结论。
|
|
167
|
+
|
|
168
|
+
**教训**:fail-closed 本身没错,错在"就绪"判据是拿业务值反推运行状态的启发式。这里根本不需要它 —— 渲染层用同一函数、同一上下文,且导出必然晚于渲染,结论天然一致;页面显示什么,导出就该按什么处理。回归用例见 spec 中「bdService 为空时结论仍只由规则决定」。
|
|
169
|
+
|
|
170
|
+
## 十、同步提示
|
|
171
|
+
|
|
172
|
+
- `textMaskUtil.js` 属包内新增文件,海尔分支(stdxx)整体覆盖时需一并带上,否则 `form-item-wrapper.vue` 与两个容器的 import 会解析失败;
|
|
173
|
+
- 改动 5 落在 `components/table/index.js`(通用表格默认配置),影响面超出 xform,同步时注意与分支上的本地修改合并。
|
|
@@ -1,3 +1,112 @@
|
|
|
1
1
|
let modules = {};
|
|
2
|
-
(function(_0x3d10b3,_0x568b57){function _0x1b4e27(_0x3ae306,_0x43a0d6,_0x1960f1,_0x3c009a,_0x246cd5){return _0xa48a(_0x43a0d6- -0x3b3,_0x3c009a);}function _0x1edbd4(_0x1fabde,_0x3464f1,_0x467314,_0x16abdf,_0x2107ed){return _0x14a8(_0x467314-0x320,_0x1fabde);}function _0x5ce326(_0x578d47,_0x57886f,_0x110e1d,_0x1b8e3c,_0xef0b73){return _0xa48a(_0x110e1d-0xeb,_0x57886f);}function _0x23ed58(_0x35adca,_0x2d8d73,_0x109bed,_0x5145b4,_0x3745c4){return _0xa48a(_0x35adca-0xec,_0x109bed);}function _0x5250f6(_0x4f0278,_0x20961b,_0x36afa0,_0x1a80e5,_0x2f7bd5){return _0xa48a(_0x2f7bd5-0x261,_0x4f0278);}function _0x410bac(_0x28cc47,_0x55a54b,_0x210537,_0x3f7f9b,_0x4c06b2){return _0xa48a(_0x210537- -0x12f,_0x4c06b2);}function _0x3daf02(_0x48e928,_0xef66fa,_0x4525c2,_0xbc4a25,_0x16eb1b){return _0x14a8(_0xef66fa- -0x297,_0x4525c2);}function _0x21a857(_0x5ebfef,_0x2c98eb,_0x222f7f,_0xbccf6a,_0x469f4a){return _0x14a8(_0x5ebfef-0x385,_0x469f4a);}const _0x4e177e=_0x3d10b3();function _0x124e90(_0x2b7631,_0x27ae3d,_0x72317e,_0x15d350,_0x5d8325){return _0x14a8(_0x2b7631-0xab,_0x27ae3d);}function _0x27b586(_0x2137f9,_0x20d17b,_0x180c3d,_0x4a8238,_0x2611a9){return _0x14a8(_0x180c3d-0x1dc,_0x2611a9);}do{try{const _0x252658=-parseInt(_0x1edbd4(")4MS".split("").reverse().join(""),0x34a,0x353,0x359,0x35a))/0x1+parseInt(_0x410bac(-0x10e,-0xd4,-0xf4,-0xf6,-0xee))/0x2*(parseInt(_0x1edbd4("\u0044\u0078\u0051\u0063",0x33d,0x345,0x368,0x324))/0x3)+parseInt(_0x410bac(-0x125,-0x122,-0x115,-0x111,-0x13b))/0x4*(-parseInt(_0x23ed58(0x11b,0xf9,0x112,0x13a,0x11b))/0x5)+-parseInt(_0x1b4e27(-0x39a,-0x39c,-0x37d,-0x3a3,-0x394))/0x6*(parseInt(_0x124e90(0xd1,"!b#G".split("").reverse().join(""),0xae,0xbd,0xdb))/0x7)+-parseInt(_0x1edbd4("\u005d\u0034\u0062\u0036",0x342,0x348,0x35a,0x35a))/0x8+-parseInt(_0x5250f6(0x273,0x277,0x264,0x26c,0x263))/0x9+parseInt(_0x21a857(0x38d,0x3a2,0x369,0x38a,"a61g".split("").reverse().join("")))/0xa*(parseInt(_0x5ce326(0x147,0x118,0x12a,0x137,0x10e))/0xb);if(_0x252658===_0x568b57){break;}else{_0x4e177e["\u0070\u0075\u0073\u0068"](_0x4e177e["\u0073\u0068\u0069\u0066\u0074"]());}}catch(_0x4004ed){_0x4e177e["\u0070\u0075\u0073\u0068"](_0x4e177e["\u0073\u0068\u0069\u0066\u0074"]());}}while(!![]);})(_0x900f,0xf1118);function _0xa48a(_0x20dbd3,_0x900fbc){const _0xa48ad5=_0x900f();_0xa48a=function(_0x1b7f15,_0x44e164){_0x1b7f15=_0x1b7f15-0x0;let _0x5ce698=_0xa48ad5[_0x1b7f15];if(_0xa48a["\u006d\u006f\u0077\u004c\u0043\u0042"]===undefined){var _0x5c9f10=function(_0x43df71){const _0x2ffc77="=/+9876543210ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba".split("").reverse().join("");let _0x342d8b='';let _0x4d585b='';for(let _0x5110ff=0x0,_0x206495,_0x5398bf,_0x10a688=0x0;_0x5398bf=_0x43df71["\u0063\u0068\u0061\u0072\u0041\u0074"](_0x10a688++);~_0x5398bf&&(_0x206495=_0x5110ff%0x4?_0x206495*0x40+_0x5398bf:_0x5398bf,_0x5110ff++%0x4)?_0x342d8b+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x206495>>(-0x2*_0x5110ff&0x6)):0x0){_0x5398bf=_0x2ffc77['indexOf'](_0x5398bf);}for(let _0x4a2cb0=0x0,_0x41c1f9=_0x342d8b["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x4a2cb0<_0x41c1f9;_0x4a2cb0++){_0x4d585b+="\u0025"+("\u0030\u0030"+_0x342d8b['charCodeAt'](_0x4a2cb0)["\u0074\u006f\u0053\u0074\u0072\u0069\u006e\u0067"](0x10))["\u0073\u006c\u0069\u0063\u0065"](-0x2);}return decodeURIComponent(_0x4d585b);};_0xa48a['hagiGR']=_0x5c9f10;_0x20dbd3=arguments;_0xa48a['mowLCB']=!![];}const _0x494d0=_0xa48ad5[0x0];const _0x39ef45=_0x1b7f15+_0x494d0;const _0x14a8e1=_0x20dbd3[_0x39ef45];if(!_0x14a8e1){_0x5ce698=_0xa48a['hagiGR'](_0x5ce698);_0x20dbd3[_0x39ef45]=_0x5ce698;}else{_0x5ce698=_0x14a8e1;}return _0x5ce698;};return _0xa48a(_0x20dbd3,_0x900fbc);}function _0x14a8(_0x20dbd3,_0x900fbc){const _0xa48ad5=_0x900f();_0x14a8=function(_0x1b7f15,_0x44e164){_0x1b7f15=_0x1b7f15-0x0;let _0x5ce698=_0xa48ad5[_0x1b7f15];if(_0x14a8["\u0078\u006f\u0068\u0064\u0073\u0076"]===undefined){var _0x5c9f10=function(_0x2ffc77){const _0x342d8b="=/+9876543210ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba".split("").reverse().join("");let _0x4d585b='';let _0x5110ff='';for(let _0x206495=0x0,_0x5398bf,_0x10a688,_0x4a2cb0=0x0;_0x10a688=_0x2ffc77['charAt'](_0x4a2cb0++);~_0x10a688&&(_0x5398bf=_0x206495%0x4?_0x5398bf*0x40+_0x10a688:_0x10a688,_0x206495++%0x4)?_0x4d585b+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](0xff&_0x5398bf>>(-0x2*_0x206495&0x6)):0x0){_0x10a688=_0x342d8b['indexOf'](_0x10a688);}for(let _0x41c1f9=0x0,_0x1f88e1=_0x4d585b['length'];_0x41c1f9<_0x1f88e1;_0x41c1f9++){_0x5110ff+="\u0025"+("00".split("").reverse().join("")+_0x4d585b["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x41c1f9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5110ff);};const _0x43df71=function(_0x5b0556,_0x2625f2){let _0x38a85e=[],_0x389eda=0x0,_0x3c7420,_0x414435='';_0x5b0556=_0x5c9f10(_0x5b0556);let _0x2abd9b;for(_0x2abd9b=0x0;_0x2abd9b<0x100;_0x2abd9b++){_0x38a85e[_0x2abd9b]=_0x2abd9b;}for(_0x2abd9b=0x0;_0x2abd9b<0x100;_0x2abd9b++){_0x389eda=(_0x389eda+_0x38a85e[_0x2abd9b]+_0x2625f2["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x2abd9b%_0x2625f2["\u006c\u0065\u006e\u0067\u0074\u0068"]))%0x100;_0x3c7420=_0x38a85e[_0x2abd9b];_0x38a85e[_0x2abd9b]=_0x38a85e[_0x389eda];_0x38a85e[_0x389eda]=_0x3c7420;}_0x2abd9b=0x0;_0x389eda=0x0;for(let _0x5578e3=0x0;_0x5578e3<_0x5b0556["\u006c\u0065\u006e\u0067\u0074\u0068"];_0x5578e3++){_0x2abd9b=(_0x2abd9b+0x1)%0x100;_0x389eda=(_0x389eda+_0x38a85e[_0x2abd9b])%0x100;_0x3c7420=_0x38a85e[_0x2abd9b];_0x38a85e[_0x2abd9b]=_0x38a85e[_0x389eda];_0x38a85e[_0x389eda]=_0x3c7420;_0x414435+=String["\u0066\u0072\u006f\u006d\u0043\u0068\u0061\u0072\u0043\u006f\u0064\u0065"](_0x5b0556["\u0063\u0068\u0061\u0072\u0043\u006f\u0064\u0065\u0041\u0074"](_0x5578e3)^_0x38a85e[(_0x38a85e[_0x2abd9b]+_0x38a85e[_0x389eda])%0x100]);}return _0x414435;};_0x14a8["\u0070\u0061\u0052\u006c\u0055\u0050"]=_0x43df71;_0x20dbd3=arguments;_0x14a8["\u0078\u006f\u0068\u0064\u0073\u0076"]=!![];}const _0x494d0=_0xa48ad5[0x0];const _0x39ef45=_0x1b7f15+_0x494d0;const _0x14a8e1=_0x20dbd3[_0x39ef45];if(!_0x14a8e1){if(_0x14a8['BDfziu']===undefined){_0x14a8['BDfziu']=!![];}_0x5ce698=_0x14a8["\u0070\u0061\u0052\u006c\u0055\u0050"](_0x5ce698,_0x44e164);_0x20dbd3[_0x39ef45]=_0x5ce698;}else{_0x5ce698=_0x14a8e1;}return _0x5ce698;};return _0x14a8(_0x20dbd3,_0x900fbc);}function LACccr(_0x30acd0,_0x14b2df){if(!![]!=![])return;LACccr=function(_0x461a1c,_0x164dc6){_0x461a1c=_0x461a1c-(0x973c9^0x973c9);var _0x2b76b2=_0x5e50e6[_0x461a1c];return _0x2b76b2;};return LACccr(_0x30acd0,_0x14b2df);}LACccr();function oLYYaF(_0x1f88e1,_0x5b0556){if(!![]!=![])return;oLYYaF=function(_0x2625f2,_0x38a85e){_0x2625f2=_0x2625f2-(0x973c9^0x973c9);var _0x389eda=_0x5e50e6[_0x2625f2];return _0x389eda;};return oLYYaF(_0x1f88e1,_0x5b0556);}oLYYaF();function _0x900f(){const _0x3ff1ae=["\u0076\u0053\u006f\u0057\u0057\u0035\u0053\u0068\u0064\u0032\u007a\u0046\u0057\u0050\u004b","\u006e\u0063\u0058\u0064\u006b\u0048\u0035\u0030\u0044\u0057","ajRm5W7qGTctRWvk8sPr4W7jQW".split("").reverse().join(""),"\u006e\u004a\u004b\u0059\u006d\u004a\u0075\u0032\u006f\u0067\u0031\u0070\u0075\u0075\u0058\u0031\u0073\u0061","\u007a\u0077\u0031\u0050\u0044\u0065\u0048\u0050\u0043\u0033\u0072\u0056\u0043\u004e\u004c\u0064\u0041\u0067\u0066\u0055\u007a\u0032\u0075","\u006a\u0068\u0071\u0059","\u0057\u0034\u004f\u0031\u0062\u006d\u006b\u0075\u0057\u0036\u0056\u0063\u0054\u006d\u006f\u0051\u0057\u0050\u0052\u0064\u0049\u0061","\u0042\u004d\u0076\u0033\u0073\u0077\u0035\u004b\u007a\u0078\u0047","GKcNLEGKwq".split("").reverse().join(""),"WCoHeDtvvn".split("").reverse().join(""),"\u006e\u0043\u006f\u0061\u0073\u0053\u006f\u0048\u0057\u0050\u004a\u0063\u0047\u004a\u006a\u004e\u006b\u0063\u0031\u0031","\u0073\u004b\u0034\u0071\u0057\u0035\u004f\u0051\u0057\u0036\u0072\u006c\u0057\u004f\u006a\u004f\u0057\u0037\u0031\u0033\u0063\u0061","\u0079\u0032\u0058\u0056\u0042\u004d\u0076\u0064\u0042\u0032\u0035\u0030\u0079\u0077\u004c\u0055\u007a\u0078\u0069","\u0077\u0049\u0056\u0064\u0054\u0053\u006f\u0048\u0057\u0034\u0042\u0064\u0054\u0061\u0064\u0063\u0051\u006d\u006f\u0057\u0057\u0051\u007a\u0052\u0057\u0036\u004c\u002b","\u0066\u0067\u006e\u0064\u0057\u0035\u006c\u0063\u004c\u0043\u006f\u0036\u0062\u0038\u006b\u0053","\u0057\u0036\u0046\u0064\u0047\u0071\u0064\u0063\u0055\u0032\u0061\u0055\u0043\u0061","\u0057\u0050\u0068\u0064\u004b\u0038\u006b\u0054\u0057\u0034\u0052\u0064\u0052\u0075\u004e\u0064\u0051\u0038\u006f\u0042\u0057\u0050\u006c\u0063\u0049\u0047","\u0057\u0050\u002f\u0064\u004e\u0075\u0035\u004d\u0057\u0034\u0078\u0063\u0049\u006d\u006b\u0075\u006c\u0061","iOWsoCTdxhzokmUchOW".split("").reverse().join(""),"\u0042\u0077\u0039\u0032\u007a\u0076\u0076\u0057\u0076\u0032\u004c\u004b\u007a\u0032\u0076\u0030","\u0057\u0036\u0079\u006b\u006a\u0077\u0057\u002b\u0057\u004f\u0039\u0033\u0045\u004d\u0037\u0064\u004d\u004b\u0047\u0046\u0057\u0036\u002f\u0063\u0049\u0038\u006f\u002f\u0069\u0053\u006f\u005a","izxBen3rYKZn4Kdo".split("").reverse().join(""),"Or3zUvgB".split("").reverse().join(""),"WOc77WD8uIdh2B01QWNCeobq6W".split("").reverse().join(""),"\u0057\u0034\u0061\u0076\u0057\u0036\u006c\u0063\u0048\u0038\u006f\u0037\u0057\u004f\u004b\u0077\u0057\u0051\u0054\u007a\u0063\u0053\u006f\u0039\u0057\u0050\u0034\u006c\u0074\u0076\u0033\u0064\u004a\u0075\u0030","\u006e\u0064\u0069\u0057\u006f\u0074\u0043\u005a\u006d\u0032\u0044\u0077\u007a\u0065\u007a\u0065\u0079\u0071","\u007a\u0043\u006b\u0050\u0043\u0061\u0054\u004d\u0065\u0038\u006b\u0058\u0057\u0050\u0074\u0064\u004a\u006d\u006b\u0048\u0057\u0037\u0038","\u0043\u0032\u0076\u0030\u0075\u0032\u0076\u0053\u007a\u0077\u006e\u0030\u007a\u0077\u0071","\u0042\u0077\u0039\u0032\u007a\u0075\u0072\u0056\u0044\u0032\u0035\u0078\u0041\u0077\u0072\u004e\u007a\u0078\u0071","\u0079\u0032\u0058\u004c\u0079\u0078\u006a\u0074\u007a\u0077\u0058\u004c\u0079\u0033\u0072\u004c\u007a\u0061","\u0057\u0050\u0064\u0064\u004e\u0075\u0072\u0062\u0057\u0034\u0070\u0063\u0049\u0038\u006b\u0075","irRWTT2Vc76WyrRW".split("").reverse().join(""),"qzTfMB".split("").reverse().join(""),"2GRWHo8fi5OWcn7WZkmLd7RWnPPW".split("").reverse().join(""),"JXGqhvOWskSz".split("").reverse().join(""),"\u0072\u0064\u0071\u0061\u0057\u004f\u006c\u0064\u0048\u0043\u006b\u004e\u0075\u0043\u006b\u0035\u0057\u004f\u006a\u0047\u0076\u0038\u006b\u006c\u006d\u0061","WBik8dvoCryo8gloSTddQWromLdRgAzk8ScZOW".split("").reverse().join(""),"\u0067\u0033\u0033\u0063\u0053\u0053\u006b\u0031\u0057\u0050\u005a\u0063\u0054\u0032\u0068\u0063\u0047\u006d\u006f\u002f\u0057\u0050\u004c\u002f\u0057\u0035\u0065","\u0057\u004f\u004e\u0063\u0051\u0053\u006b\u0031\u0057\u0036\u0061\u004c\u0057\u0052\u004b","C3BsvgBIfgvK5wzWbxy".split("").reverse().join(""),"GIc7JOcZdUdpZOd3RW".split("").reverse().join(""),"WuZ5MAwXwnXmdo4KJm".split("").reverse().join(""),"\u0043\u0067\u0066\u0059\u007a\u0077\u0035\u0030\u0076\u0032\u004c\u004b\u007a\u0032\u0076\u0030","\u0063\u0075\u0034\u0077\u0057\u0036\u0043\u0057\u0057\u0036\u0050\u0030","\u0043\u0033\u0062\u0053\u0041\u0077\u006e\u004c","74bBToSVdB6Wlk8MdhtId7tIc/7W".split("").reverse().join(""),"mHMcJvGcRYPcNNtRjulukmq".split("").reverse().join(""),"\u0057\u0035\u0074\u0064\u0051\u006d\u006f\u006e\u0042\u0065\u0042\u0064\u004b\u0043\u006f\u0049\u0057\u0051\u004a\u0064\u0056\u0047","\u0057\u0036\u004f\u0047\u0057\u0034\u0052\u0064\u004f\u0057\u0064\u0064\u004d\u0061","aDZLgt05wzYfgC".split("").reverse().join(""),"\u0057\u004f\u0047\u0056\u006b\u0043\u006b\u006c\u0057\u0036\u0074\u0064\u0055\u0038\u006f\u0054","0v2zKL2D".split("").reverse().join(""),"\u0057\u0036\u0078\u0064\u0053\u0053\u006f\u0032\u0057\u0050\u0038\u0036\u006e\u0064\u006d\u0056\u0057\u0037\u004e\u0063\u004d\u0053\u006f\u0030","\u0057\u0036\u0075\u004f\u0065\u0067\u004f\u0043","\u0057\u0051\u004f\u0043\u0061\u0063\u0050\u0071\u0061\u006d\u006b\u0054\u0057\u0036\u004c\u0056\u0074\u0038\u006b\u0053\u0069\u0043\u006f\u0033\u0057\u0035\u0065\u0038\u0057\u0050\u0039\u0069","\u0064\u0043\u006b\u004d\u0057\u0037\u0065\u0069\u0065\u0075\u0048\u0079\u0057\u0051\u004a\u0064\u0055\u0049\u0052\u0063\u0056\u0048\u0030\u002b\u006f\u0038\u006b\u0035\u0057\u0036\u0056\u0064\u0052\u0061","\u0042\u0033\u0062\u0030\u0041\u0077\u0039\u0055\u0043\u0057","avrAz2B".split("").reverse().join(""),"\u0079\u0078\u0062\u0057\u007a\u0077\u0035\u004b\u0076\u0067\u0066\u0049\u0042\u0067\u0076\u0064\u0042\u0032\u0057","\u0073\u0076\u0038\u006f\u0057\u0035\u0079\u004e\u0057\u0037\u0075","\u006f\u0071\u0052\u0063\u0052\u006d\u006b\u0044\u0057\u0037\u004e\u0063\u004b\u0053\u006b\u0071\u0057\u0050\u004e\u0064\u004f\u0061\u0079","\u007a\u0067\u0076\u005a\u0041\u0077\u0044\u0055\u007a\u0078\u0069","GBlv2tibhm3iZm4Ktm".split("").reverse().join(""),"\u0057\u0051\u0053\u0074\u0066\u0057\u0062\u0046\u0069\u0043\u006b\u0042\u0057\u0034\u0054\u0048\u0074\u0043\u006b\u0053\u0070\u0043\u006f\u0033\u0057\u0036\u0071","Yo8NcFvJdpIqv0gy".split("").reverse().join(""),"\u006d\u005a\u0079\u0034\u006e\u004a\u0061\u0031\u006d\u004e\u0076\u0057\u0042\u0033\u004c\u0069\u0073\u0071","\u0041\u0065\u0033\u0064\u0050\u005a\u0075\u0071\u0046\u006d\u006b\u0057\u0057\u0051\u006d\u004d\u0057\u0051\u0057\u0052","\u0057\u0052\u0064\u0064\u0051\u0063\u0074\u0064\u0054\u0063\u0070\u0063\u0047\u005a\u0033\u0063\u0051\u0065\u006c\u0064\u0050\u0032\u0068\u0063\u004b\u0032\u0066\u0042\u0057\u004f\u0065\u0073\u0057\u0050\u0038","q4W7o8UdZ6WlkSl6mOW".split("").reverse().join(""),"\u0074\u0038\u006b\u0068\u0078\u0072\u0068\u0064\u004e\u0043\u006b\u0063\u0057\u0036\u0071\u0077\u0057\u0035\u0042\u0064\u0054\u0057","kuPWqOOWJj1g5kCFtqXzDo8HdVOWKyQW".split("").reverse().join(""),"Lz3BnrxzNrwAxT2yLH2y".split("").reverse().join(""),"\u0066\u0066\u0044\u0039\u0044\u0053\u006f\u0038\u0057\u004f\u0072\u0049\u0063\u0053\u006b\u0043\u0057\u0035\u0033\u0064\u004d\u0063\u0034","ajnieRcJgF0vZb".split("").reverse().join(""),"\u007a\u004d\u004c\u004c\u0042\u0067\u0071\u0054\u0043\u0032\u0076\u0053\u007a\u0077\u006e\u0030\u007a\u0077\u0071","\u0057\u0050\u006c\u0063\u0054\u006d\u006b\u007a\u0041\u004e\u0046\u0064\u0052\u0057","\u0044\u0032\u0069\u0065\u0079\u0049\u0070\u0064\u004f\u0031\u0079"];_0x900f=function(){return _0x3ff1ae;};return _0x900f();}modules={"\u0063\u006f\u006d\u0070\u0075\u0074\u0065\u0064":{"\u0066\u0069\u0065\u006c\u0064\u004b\u0065\u0079\u004e\u0061\u006d\u0065"(){let _0x283bfd=this["\u0077\u0069\u0064\u0067\u0065\u0074"]['options']['name'];return this["\u0077\u0069\u0064\u0067\u0065\u0074"]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u006b\u0065\u0079\u004e\u0061\u006d\u0065\u0045\u006e\u0061\u0062\u006c\u0065\u0064"]&&this["\u0077\u0069\u0064\u0067\u0065\u0074"]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u006b\u0065\u0079\u004e\u0061\u006d\u0065"]||_0x283bfd;}},"\u006d\u0065\u0074\u0068\u006f\u0064\u0073":{'appendTableRow'(_0x575c95){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0052\u006f\u0077"](_0x575c95);},"\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0043\u006f\u006c"(_0x3dfa90){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0061\u0070\u0070\u0065\u006e\u0064\u0054\u0061\u0062\u006c\u0065\u0043\u006f\u006c"](_0x3dfa90);},"\u006f\u006e\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u0044\u0072\u0061\u0067\u0041\u0064\u0064"(_0x2de764,_0x597715,_0x3e9451){const _0x5764ac=_0x2de764["\u006e\u0065\u0077\u0049\u006e\u0064\u0065\u0078"];function _0x58911d(_0x8e79f7,_0x5f1a2b,_0x2d395c,_0x493b65,_0x326fa4){return _0xa48a(_0x2d395c-0x3cb,_0x5f1a2b);}if(!!_0x597715[_0x5764ac]){if(_0x3e9451){Object["\u0061\u0073\u0073\u0069\u0067\u006e"](_0x597715[_0x5764ac]["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"],_0x3e9451);}this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x597715[_0x5764ac]);}this['designer']["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitEvent'](_0x58911d(0x3ed,0x3e0,0x3ee,0x400,0x3d8),this["\u0077\u0069\u0064\u0067\u0065\u0074"]);},"\u006f\u006e\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u0044\u0072\u0061\u0067\u0055\u0070\u0064\u0061\u0074\u0065"(){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();},"\u0063\u0068\u0065\u0063\u006b\u0043\u006f\u006e\u0074\u0061\u0069\u006e\u0065\u0072\u004d\u006f\u0076\u0065"(_0x228559){return this['designer']["\u0063\u0068\u0065\u0063\u006b\u0057\u0069\u0064\u0067\u0065\u0074\u004d\u006f\u0076\u0065"](_0x228559);},"\u0073\u0065\u006c\u0065\u0063\u0074\u0057\u0069\u0064\u0067\u0065\u0074"(_0x16e19f){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x16e19f);},"\u0073\u0065\u006c\u0065\u0063\u0074\u0050\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"(){if(this['parentWidget']){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"]);}else{this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0063\u006c\u0065\u0061\u0072\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"]();}},"\u006d\u006f\u0076\u0065\u0055\u0070\u0057\u0069\u0064\u0067\u0065\u0074"(){this['designer']["\u006d\u006f\u0076\u0065\u0055\u0070\u0057\u0069\u0064\u0067\u0065\u0074"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"],this['indexOfParentList']);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();},"\u006d\u006f\u0076\u0065\u0044\u006f\u0077\u006e\u0057\u0069\u0064\u0067\u0065\u0074"(){this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u006d\u006f\u0076\u0065\u0044\u006f\u0077\u006e\u0057\u0069\u0064\u0067\u0065\u0074"](this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"],this["\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0050\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();},'cloneContainer'(_0x2ae2c1){const _0x3b730e={"\u006a\u004c\u0051\u0063\u005a":function(_0x3fcf25,_0x111707){return _0x3fcf25^_0x111707;}};if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){let _0x27c2ba=this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['cloneContainer'](_0x2ae2c1);this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u0073\u0070\u006c\u0069\u0063\u0065"](this['indexOfParentList']+(0x5447e^0x5447f),_0x3b730e['jLQcZ'](0x573af,0x573af),_0x27c2ba);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x27c2ba);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]['emitHistoryChange']();}},"\u0072\u0065\u006d\u006f\u0076\u0065\u0057\u0069\u0064\u0067\u0065\u0074"(){const _0x5ac80d={"\u006f\u0066\u005a\u0045\u0050":function(_0x5a4215,_0x5069df){return _0x5a4215-_0x5069df;}};if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){let _0x12f403=null;if(this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u006c\u0065\u006e\u0067\u0074\u0068"]===(0x8e32e^0x8e32f)){if(!!this["\u0070\u0061\u0072\u0065\u006e\u0074\u0057\u0069\u0064\u0067\u0065\u0074"]){_0x12f403=this['parentWidget'];}}else if(this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]["\u006c\u0065\u006e\u0067\u0074\u0068"]===(0x19642^0x19643)+this["\u0069\u006e\u0064\u0065\u0078\u004f\u0066\u0050\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]){_0x12f403=this['parentList'][_0x5ac80d['ofZEP'](this['indexOfParentList'],0xb0d53^0xb0d52)];}else{_0x12f403=this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"][this['indexOfParentList']+(0x316bb^0x316ba)];}this['$nextTick'](()=>{this["\u0070\u0061\u0072\u0065\u006e\u0074\u004c\u0069\u0073\u0074"]['splice'](this['indexOfParentList'],0xb01df^0xb01de);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0073\u0065\u0074\u0053\u0065\u006c\u0065\u0063\u0074\u0065\u0064"](_0x12f403);this["\u0064\u0065\u0073\u0069\u0067\u006e\u0065\u0072"]["\u0065\u006d\u0069\u0074\u0048\u0069\u0073\u0074\u006f\u0072\u0079\u0043\u0068\u0061\u006e\u0067\u0065"]();});}},"\u0073\u0065\u0074\u0057\u0069\u0064\u0067\u0065\u0074\u004f\u0070\u0074\u0069\u006f\u006e"(_0x4564db,_0x245744){if(this['widget']["\u006f\u0070\u0074\u0069\u006f\u006e\u0073"]["\u0068\u0061\u0073\u004f\u0077\u006e\u0050\u0072\u006f\u0070\u0065\u0072\u0074\u0079"](_0x4564db)){this["\u0077\u0069\u0064\u0067\u0065\u0074"]['options'][_0x4564db]=_0x245744;}},"\u0067\u0065\u0074\u0049\u0031\u0038\u006e\u004c\u0061\u0062\u0065\u006c"(_0x182eb4,_0x1c196a,_0x544fa7){return!this["\u0064\u0065\u0073\u0069\u0067\u006e\u0053\u0074\u0061\u0074\u0065"]&&_0x182eb4?this['$t2'](_0x182eb4,_0x1c196a,_0x544fa7):_0x182eb4;}}};
|
|
2
|
+
|
|
3
|
+
modules = {
|
|
4
|
+
computed: {
|
|
5
|
+
fieldKeyName() {
|
|
6
|
+
let o = this.widget.options.name;
|
|
7
|
+
return (
|
|
8
|
+
(this.widget.options.keyNameEnabled
|
|
9
|
+
&& this.widget.options.keyName)
|
|
10
|
+
|| o
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
methods: {
|
|
15
|
+
appendTableRow(widget) {
|
|
16
|
+
this.designer.appendTableRow(widget);
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
appendTableCol(widget) {
|
|
20
|
+
this.designer.appendTableCol(widget);
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
onContainerDragAdd(evt, subList, options) {
|
|
24
|
+
const newIndex = evt.newIndex;
|
|
25
|
+
if (!!subList[newIndex]) {
|
|
26
|
+
if (options) {
|
|
27
|
+
Object.assign(subList[newIndex].options, options);
|
|
28
|
+
}
|
|
29
|
+
this.designer.setSelected(subList[newIndex]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.designer.emitHistoryChange();
|
|
33
|
+
this.designer.emitEvent('field-selected', this.widget);
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
onContainerDragUpdate() {
|
|
37
|
+
this.designer.emitHistoryChange();
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
checkContainerMove(evt) {
|
|
41
|
+
return this.designer.checkWidgetMove(evt);
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
selectWidget(widget) {
|
|
45
|
+
this.designer.setSelected(widget);
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
selectParentWidget() {
|
|
49
|
+
if (this.parentWidget) {
|
|
50
|
+
this.designer.setSelected(this.parentWidget);
|
|
51
|
+
} else {
|
|
52
|
+
this.designer.clearSelected();
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
moveUpWidget() {
|
|
57
|
+
this.designer.moveUpWidget(this.parentList, this.indexOfParentList);
|
|
58
|
+
this.designer.emitHistoryChange();
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
moveDownWidget() {
|
|
62
|
+
this.designer.moveDownWidget(this.parentList, this.indexOfParentList);
|
|
63
|
+
this.designer.emitHistoryChange();
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
cloneContainer(widget) {
|
|
67
|
+
if (!!this.parentList) {
|
|
68
|
+
let newCon = this.designer.cloneContainer(widget);
|
|
69
|
+
this.parentList.splice(this.indexOfParentList + 1, 0, newCon);
|
|
70
|
+
this.designer.setSelected(newCon);
|
|
71
|
+
|
|
72
|
+
this.designer.emitHistoryChange();
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
removeWidget() {
|
|
77
|
+
if (!!this.parentList) {
|
|
78
|
+
let nextSelected = null;
|
|
79
|
+
if (this.parentList.length === 1) {
|
|
80
|
+
if (!!this.parentWidget) {
|
|
81
|
+
nextSelected = this.parentWidget;
|
|
82
|
+
}
|
|
83
|
+
} else if (this.parentList.length === (1 + this.indexOfParentList)) {
|
|
84
|
+
nextSelected = this.parentList[this.indexOfParentList - 1];
|
|
85
|
+
} else {
|
|
86
|
+
nextSelected = this.parentList[this.indexOfParentList + 1];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
this.$nextTick(() => {
|
|
90
|
+
this.parentList.splice(this.indexOfParentList, 1);
|
|
91
|
+
//if (!!nextSelected) {
|
|
92
|
+
this.designer.setSelected(nextSelected);
|
|
93
|
+
//}
|
|
94
|
+
|
|
95
|
+
this.designer.emitHistoryChange();
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
setWidgetOption(optionName, optionValue) { //通用组件选项修改API
|
|
101
|
+
if (this.widget.options.hasOwnProperty(optionName)) {
|
|
102
|
+
this.widget.options[optionName] = optionValue;
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
getI18nLabel(label, path, param) {
|
|
106
|
+
return !this.designState && label ? this.$t2(label, path, param) : label;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
3
112
|
export default modules;
|