resolver-egretimp-plus 0.1.141 → 0.1.142
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/dist/h5/index.js +2 -2
- package/dist/web/index.js +2 -2
- package/package.json +1 -1
- package/src/rules/parseCondition.js +9 -4
- package/src/rulesOfDate/parseCondition.js +9 -3
- package/src/utils/common.js +10 -1
- package/src/utils/render.jsx +3 -3
- package//346/270/262/346/237/223/345/231/250/344/275/277/347/224/250/346/211/213/345/206/214.md +2242 -0
- package//344/275/277/347/224/250/346/211/213/345/206/214.md +0 -1216
- package//347/273/204/344/273/266/351/205/215/347/275/256/345/261/236/346/200/247/345/256/214/346/225/264/345/217/202/350/200/203.md +0 -1094
package//346/270/262/346/237/223/345/231/250/344/275/277/347/224/250/346/211/213/345/206/214.md
ADDED
|
@@ -0,0 +1,2242 @@
|
|
|
1
|
+
# 组件配置属性完整参考
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
- [渲染器使用](#渲染器使用)
|
|
6
|
+
- [基础使用](#基础使用)
|
|
7
|
+
- [从后端加载配置](#从后端加载配置)
|
|
8
|
+
- [完整属性列表](#完整属性列表)
|
|
9
|
+
- [事件与数据绑定](#事件与数据绑定)
|
|
10
|
+
- [多模式支持](#多模式支持)
|
|
11
|
+
- [全局通用属性](#全局通用属性)
|
|
12
|
+
- [基础属性](#基础属性)
|
|
13
|
+
- [布局属性](#布局属性)
|
|
14
|
+
- [表单项属性](#表单项属性)
|
|
15
|
+
- [校验属性](#校验属性)
|
|
16
|
+
- [事件属性](#事件属性)
|
|
17
|
+
- [服务编排属性](#服务编排属性)
|
|
18
|
+
- [表单输入组件](#表单输入组件)
|
|
19
|
+
- [ElInput - 文本输入框](#elinput---文本输入框)
|
|
20
|
+
- [ElSelect - 下拉选择框](#elselect---下拉选择框)
|
|
21
|
+
- [ElRadio - 单选框](#elradio---单选框)
|
|
22
|
+
- [ElCheckbox - 复选框](#elcheckbox---复选框)
|
|
23
|
+
- [ElDatePicker - 日期选择器](#eldatepicker---日期选择器)
|
|
24
|
+
- [ElTimePicker - 时间选择器](#eltimepicker---时间选择器)
|
|
25
|
+
- [ElInputNumber - 数字输入框](#elinputnumber---数字输入框)
|
|
26
|
+
- [按钮与文本组件](#按钮与文本组件)
|
|
27
|
+
- [ElButton - 按钮](#elbutton---按钮)
|
|
28
|
+
- [ElText - 静态文本](#eltext---静态文本)
|
|
29
|
+
- [布局组件](#布局组件)
|
|
30
|
+
- [CustomComponentFormLayout - 表单布局](#customcomponentformlayout---表单布局)
|
|
31
|
+
- [CustomComponentTabs - 标签页](#customcomponenttabs---标签页)
|
|
32
|
+
- [CustomComponentCollapse - 折叠面板](#customcomponentcollapse---折叠面板)
|
|
33
|
+
- [CustomComponentDialog - 对话框](#customcomponentdialog---对话框)
|
|
34
|
+
- [CustomComponentCycle - 循环列表](#customcomponentcycle---循环列表)
|
|
35
|
+
- [数据展示组件](#数据展示组件)
|
|
36
|
+
- [CustomComponentTable - 表格](#customcomponenttable---表格)
|
|
37
|
+
- [ElPagination - 分页](#elpagination---分页)
|
|
38
|
+
- [附录](#附录)
|
|
39
|
+
- [组件类型映射表](#组件类型映射表)
|
|
40
|
+
- [配置命名规则](#配置命名规则)
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 渲染器使用
|
|
45
|
+
|
|
46
|
+
> **说明**: 渲染器通过三层封装对外暴露:
|
|
47
|
+
> - **PC端**: `resolver-web.vue` → `resolver-common.vue` → `index.jsx`
|
|
48
|
+
> - **H5端**: `resolver-H5.vue` → `resolver-common.vue` → `index.jsx`
|
|
49
|
+
> - 用户使用的是最外层的 `resolver-web.vue` 或 `resolver-H5.vue`
|
|
50
|
+
|
|
51
|
+
### 基础使用
|
|
52
|
+
|
|
53
|
+
```vue
|
|
54
|
+
<template>
|
|
55
|
+
<Resolver
|
|
56
|
+
:busiIdentityId="'PAGE_USER_001'"
|
|
57
|
+
v-model="formData"
|
|
58
|
+
:mode="mode"
|
|
59
|
+
:selects="selectOptions"
|
|
60
|
+
:axiosInstance="axios"
|
|
61
|
+
:messageInstance="ElMessage"
|
|
62
|
+
:loadingInstance="loadingService"
|
|
63
|
+
/>
|
|
64
|
+
</template>
|
|
65
|
+
|
|
66
|
+
<script setup>
|
|
67
|
+
import { ref } from 'vue'
|
|
68
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
69
|
+
import { ElMessage } from 'element-plus'
|
|
70
|
+
|
|
71
|
+
// 表单数据(双向绑定)
|
|
72
|
+
const formData = ref({})
|
|
73
|
+
|
|
74
|
+
// 模式:operate | detail | log
|
|
75
|
+
const mode = ref('operate')
|
|
76
|
+
|
|
77
|
+
// 下拉选项(可选,不传则从配置平台自动加载)
|
|
78
|
+
const selectOptions = ref({})
|
|
79
|
+
</script>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
> **提示**: 基础使用模式下,只需传入 `busiIdentityId`,渲染器会自动从配置平台加载页面配置和枚举数据。
|
|
83
|
+
|
|
84
|
+
### 从后端加载配置
|
|
85
|
+
|
|
86
|
+
> **核心说明**: `busiIdentityId` 是配置平台的页面唯一标识。渲染器内置了配置加载逻辑,只需传入该标识,即可自动从配置平台获取页面配置和枚举数据,无需手动调用接口。
|
|
87
|
+
|
|
88
|
+
```vue
|
|
89
|
+
<template>
|
|
90
|
+
<Resolver
|
|
91
|
+
ref="resolverRef"
|
|
92
|
+
:busiIdentityId="busiIdentityId"
|
|
93
|
+
v-model="formData"
|
|
94
|
+
:selects="selects"
|
|
95
|
+
:lang="lang"
|
|
96
|
+
:loadingInstance="loadingInstance"
|
|
97
|
+
:messageInstance="ElMessage"
|
|
98
|
+
@on-loaded-config-competed="handleConfigLoaded"
|
|
99
|
+
@on-loaded-selects-competed="handleSelectsLoaded"
|
|
100
|
+
/>
|
|
101
|
+
</template>
|
|
102
|
+
|
|
103
|
+
<script setup>
|
|
104
|
+
import { ref } from 'vue'
|
|
105
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
106
|
+
import { ElMessage, ElLoading } from 'element-plus'
|
|
107
|
+
|
|
108
|
+
const resolverRef = ref(null)
|
|
109
|
+
const formData = ref({})
|
|
110
|
+
const lang = ref('zh')
|
|
111
|
+
|
|
112
|
+
// 配置平台页面标识(关键属性)
|
|
113
|
+
const busiIdentityId = ref('PAGE_USER_MANAGEMENT_001')
|
|
114
|
+
|
|
115
|
+
// 下拉选项(会自动填充)
|
|
116
|
+
const selects = ref({})
|
|
117
|
+
|
|
118
|
+
// 配置加载完成回调
|
|
119
|
+
const handleConfigLoaded = (config) => {
|
|
120
|
+
console.log('✅ 页面配置加载完成', config)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// 枚举加载完成回调
|
|
124
|
+
const handleSelectsLoaded = (selectsData) => {
|
|
125
|
+
console.log('✅ 枚举数据加载完成', selectsData)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 表单校验
|
|
129
|
+
const handleSubmit = async () => {
|
|
130
|
+
await resolverRef.value.validate((valid) => {
|
|
131
|
+
if (valid) {
|
|
132
|
+
console.log('表单数据:', formData.value)
|
|
133
|
+
}
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
</script>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
> **说明**:
|
|
140
|
+
> - 渲染器会在组件挂载时自动根据 `busiIdentityId` 加载配置
|
|
141
|
+
> - 如果传入了 `nativeConfig`,则不会自动加载,直接使用传入的配置
|
|
142
|
+
> - 如果传入了 `selects` 对象,枚举数据会自动合并到该对象中
|
|
143
|
+
|
|
144
|
+
### 完整属性列表
|
|
145
|
+
|
|
146
|
+
> **重要说明**:
|
|
147
|
+
> - 渲染器通过 `v-bind="attrs"` 透传属性机制,`index.jsx` 中定义的所有属性(除 `config` 外)都可以直接使用
|
|
148
|
+
> - `config` 属性被中间层覆盖,如需手动传入配置请使用 `nativeConfig`
|
|
149
|
+
|
|
150
|
+
#### 完整属性列表
|
|
151
|
+
|
|
152
|
+
| 属性名 | 类型 | 默认值 | 说明 | 示例 |
|
|
153
|
+
|--------|------|--------|------|------|
|
|
154
|
+
| **核心属性** | | | | |
|
|
155
|
+
| `busiIdentityId` | String | - | **配置平台页面标识**,用于自动加载页面配置 | `'PAGE_USER_001'` |
|
|
156
|
+
| `nativeConfig` | Object/Array | - | 外部传入的配置对象(不传则自动加载) | `{ pmPageMetaList: [] }` |
|
|
157
|
+
| `modelValue` | Any | null | 双向绑定的表单数据 | `{ username: 'test' }` |
|
|
158
|
+
| `mode` | String | 'operate' | 渲染模式 | `'operate'`, `'detail'`, `'log'` |
|
|
159
|
+
| `OPEN_DATA_RULES` | Boolean | 内置常量 | 是否开启根据数据加载组件逻辑 | `true` |
|
|
160
|
+
| `components` | Object | {} | 自定义组件注册 | `{ CustomInput: MyInputComponent }` |
|
|
161
|
+
| `selects` | Object | {} | 下拉选项数据(会被中间层合并处理) | `{ status_options: [...] }` |
|
|
162
|
+
| `dataLoad` | Boolean | false | 是否开始执行规则初始化 | `true` |
|
|
163
|
+
| **环境配置** | | | | |
|
|
164
|
+
| `lang` | String | 'zh' | 语言 | `'zh'`, `'en'` |
|
|
165
|
+
| `isH5` | Boolean | false | 是否移动端 | `true`, `false` |
|
|
166
|
+
| `requestTraceId` | String | 自动生成 | 请求追踪ID | `'trace-123'` |
|
|
167
|
+
| **依赖实例** | | | | |
|
|
168
|
+
| `axiosInstance` | Object/Function | null | Axios请求实例 | `axios` |
|
|
169
|
+
| `loadingInstance` | Object/Function | null | 加载服务实例 | `ElLoading.service()` |
|
|
170
|
+
| `messageInstance` | Object/Function | null | 消息提示实例 | `ElMessage` |
|
|
171
|
+
| `copyModal` | Object/Function | null | 保存成功弹框实例 | 自定义弹框函数 |
|
|
172
|
+
| `confirmInstance` | Object/Function | 内置函数 | 确认对话框实例 | `ElMessageBox.confirm` |
|
|
173
|
+
| `openChildDialogInstance` | Function | 内置函数 | 打开子对话框实例 | 自定义函数 |
|
|
174
|
+
| **数据配置** | | | | |
|
|
175
|
+
| `getNativeComps` | Function | 内置函数 | 获取自定义组件 | `() => ({composeComponents: {}})` |
|
|
176
|
+
| `polyfillConfigs` | Object | {} | **配置补充对象**,用于在低码平台配置不足时通过代码补充组件属性 | `{ 'hireRelat': (config) => ({}) }` |
|
|
177
|
+
| `dialogComponents` | Object | {} | 输入弹框组件中的组件 | `{ DialogInput: MyComponent }` |
|
|
178
|
+
| `axiosConfig` | Object | null | Axios配置对象 | `{ timeout: 5000 }` |
|
|
179
|
+
| `buttonActions` | Object | {} | 按钮的工作集合 | `{ submit: fn, save: fn }` |
|
|
180
|
+
| **加载事件** | | | | |
|
|
181
|
+
| `loadEvnetsReq` | Object | {} | 加载事件的额外请求参数 | `{ extraParam: 'value' }` |
|
|
182
|
+
| `loadEventsBefore` | Function | null | 加载事件前钩子 | `({reqConfig}) => {}` |
|
|
183
|
+
| `loadEventsAfter` | Function | null | 加载事件后钩子 | `(result) => result` |
|
|
184
|
+
| **请求参数** | | | |
|
|
185
|
+
| `loadConfigReq` | Object | {} | 加载配置的额外请求参数 | `{ version: '1.0' }` |
|
|
186
|
+
| `builtPolyfillReq` | Object | {} | 所有内置接口的额外参数 | `{ token: 'xxx' }` |
|
|
187
|
+
| `businessIdentityReqData` | Object | {} | 加载服务中businessIdentity的额外参数 | `{ extraData: {} }` |
|
|
188
|
+
| `dialogReq` | Object | {} | 弹框页面传递的请求数据 | `{ dialogParam: 'value' }` |
|
|
189
|
+
| **弹框相关** | | | |
|
|
190
|
+
| `parentRootValue` | Object | {} | 父页面传入的根数据(弹框场景) | `{ parentData: {} }` |
|
|
191
|
+
| `parentDynamicMapComp` | Object | {} | 父页面传入的配置(弹框场景) | `{ dynamicMap: {} }` |
|
|
192
|
+
| `selectionsObj` | Object | {} | 父页面已选中的数据(控制表格选中禁用) | `{ selections: [], primaryKeys: [] }` |
|
|
193
|
+
| **回调函数** | | | |
|
|
194
|
+
| `messageCb` | Function | - | 提示语的回调 | `(msg) => {}` |
|
|
195
|
+
| `showCopyModal` | Function | - | 保存后弹框提示编码 | `(code) => {}` |
|
|
196
|
+
| `onLoadedConfigCompeted` | Function | - | 配置加载完成回调 | `(config) => {}` |
|
|
197
|
+
| `onLoadedSelectsCompeted` | Function | - | 枚举加载完成回调 | `(selects) => {}` |
|
|
198
|
+
| **致远BPM相关** | | | |
|
|
199
|
+
| `openBpm` | Boolean | false | 是否开启致远流程功能 | `true` |
|
|
200
|
+
| `bpmMessage` | Object/Function | {} | 传递给致远的参数 | `{ workflowId: '123' }` |
|
|
201
|
+
| `bpmSubmitBtn` | String | '' | 配置了保存服务的按钮路径 | `'a->b->c'` |
|
|
202
|
+
| `bpmActions` | Object | {} | 致远按钮动作配置 | `{ submit: {...} }` |
|
|
203
|
+
| `bpmConfigs` | Object | {} | 致远额外配置 | `{ customValidate: fn }` |
|
|
204
|
+
| `bpmBtns` | Array | [] | 致远按钮列表 | `['submit', 'approve']` |
|
|
205
|
+
| `bpmBtnPosition` | Number | 3 | 致远按钮位置 | `3` |
|
|
206
|
+
| **模块加载** | | | |
|
|
207
|
+
| `loadModuleCache` | Object | {} | 加载上传自定义组件需要的模块集合 | `{ moduleName: module }` |
|
|
208
|
+
|
|
209
|
+
### 事件与数据绑定
|
|
210
|
+
|
|
211
|
+
#### v-model 双向绑定
|
|
212
|
+
|
|
213
|
+
```vue
|
|
214
|
+
<template>
|
|
215
|
+
<Resolver
|
|
216
|
+
:config="config"
|
|
217
|
+
v-model="formData"
|
|
218
|
+
/>
|
|
219
|
+
</template>
|
|
220
|
+
|
|
221
|
+
<script setup>
|
|
222
|
+
import { ref, watch } from 'vue'
|
|
223
|
+
|
|
224
|
+
const formData = ref({
|
|
225
|
+
username: '',
|
|
226
|
+
status: '1'
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
// 监听数据变化
|
|
230
|
+
watch(formData, (newVal) => {
|
|
231
|
+
console.log('表单数据变化:', newVal)
|
|
232
|
+
}, { deep: true })
|
|
233
|
+
</script>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
#### 获取组件 Ref
|
|
237
|
+
|
|
238
|
+
渲染器通过 `defineExpose` 暴露了以下方法,可通过 `ref` 调用:
|
|
239
|
+
|
|
240
|
+
| 方法名 | 类型 | 说明 | 示例 |
|
|
241
|
+
|--------|------|------|------|
|
|
242
|
+
| `validate` | Function | 表单校验方法 | `resolverRef.value.validate()` |
|
|
243
|
+
| `dynamicMapComp` | Object | 动态组件映射对象 | `resolverRef.value.dynamicMapComp` |
|
|
244
|
+
| `pageConfig` | Object | 当前页面配置 | `resolverRef.value.pageConfig` |
|
|
245
|
+
| `rootForm` | Object | 根表单引用 | `resolverRef.value.rootForm` |
|
|
246
|
+
| `getRequestTraceId` | Function | 获取请求追踪ID | `resolverRef.value.getRequestTraceId()` |
|
|
247
|
+
| `toExecuteLoadServices` | Function | 重新执行加载服务 | `resolverRef.value.toExecuteLoadServices()` |
|
|
248
|
+
|
|
249
|
+
```vue
|
|
250
|
+
<template>
|
|
251
|
+
<Resolver
|
|
252
|
+
ref="resolverRef"
|
|
253
|
+
:config="config"
|
|
254
|
+
v-model="formData"
|
|
255
|
+
/>
|
|
256
|
+
<el-button @click="handleSubmit">提交</el-button>
|
|
257
|
+
</template>
|
|
258
|
+
|
|
259
|
+
<script setup>
|
|
260
|
+
import { ref } from 'vue'
|
|
261
|
+
|
|
262
|
+
const resolverRef = ref(null)
|
|
263
|
+
const formData = ref({})
|
|
264
|
+
|
|
265
|
+
// 校验表单
|
|
266
|
+
const handleSubmit = async () => {
|
|
267
|
+
try {
|
|
268
|
+
await resolverRef.value.validate()
|
|
269
|
+
console.log('校验通过', formData.value)
|
|
270
|
+
} catch (error) {
|
|
271
|
+
console.error('校验失败', error)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// 获取配置信息
|
|
276
|
+
const getConfig = () => {
|
|
277
|
+
console.log('页面配置:', resolverRef.value.pageConfig)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// 重新执行加载服务
|
|
281
|
+
const reload = () => {
|
|
282
|
+
resolverRef.value.toExecuteLoadServices()
|
|
283
|
+
}
|
|
284
|
+
</script>
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### 多模式支持
|
|
288
|
+
|
|
289
|
+
#### 操作模式 (operate)
|
|
290
|
+
|
|
291
|
+
默认模式,所有字段可编辑:
|
|
292
|
+
|
|
293
|
+
```vue
|
|
294
|
+
<Resolver :config="config" v-model="data" mode="operate" />
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
#### 详情模式 (detail)
|
|
298
|
+
|
|
299
|
+
所有字段只读,以文本形式展示:
|
|
300
|
+
|
|
301
|
+
```vue
|
|
302
|
+
<Resolver :config="config" v-model="data" mode="detail" />
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
#### 日志模式 (log)
|
|
306
|
+
|
|
307
|
+
类似详情模式,但强调数据不可修改,用于查看历史记录:
|
|
308
|
+
|
|
309
|
+
```vue
|
|
310
|
+
<Resolver :config="config" v-model="data" mode="log" />
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
#### 模式切换示例
|
|
314
|
+
|
|
315
|
+
```vue
|
|
316
|
+
<template>
|
|
317
|
+
<div>
|
|
318
|
+
<el-radio-group v-model="currentMode">
|
|
319
|
+
<el-radio label="operate">编辑</el-radio>
|
|
320
|
+
<el-radio label="detail">查看</el-radio>
|
|
321
|
+
<el-radio label="log">日志</el-radio>
|
|
322
|
+
</el-radio-group>
|
|
323
|
+
|
|
324
|
+
<Resolver
|
|
325
|
+
:config="config"
|
|
326
|
+
v-model="formData"
|
|
327
|
+
:mode="currentMode"
|
|
328
|
+
/>
|
|
329
|
+
</div>
|
|
330
|
+
</template>
|
|
331
|
+
|
|
332
|
+
<script setup>
|
|
333
|
+
import { ref } from 'vue'
|
|
334
|
+
|
|
335
|
+
const currentMode = ref('operate')
|
|
336
|
+
const formData = ref({})
|
|
337
|
+
</script>
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### polyfillConfigs - 配置补充属性
|
|
341
|
+
|
|
342
|
+
> **核心说明**: `polyfillConfigs` 用于在低码平台配置无法满足需求时,通过代码动态补充或覆盖组件配置属性。
|
|
343
|
+
|
|
344
|
+
#### 使用场景
|
|
345
|
+
|
|
346
|
+
当遇到以下情况时,可以使用 `polyfillConfigs`:
|
|
347
|
+
|
|
348
|
+
1. **低码平台不支持的配置**: 某些复杂的业务逻辑或特殊属性在低码平台中无法配置
|
|
349
|
+
2. **动态计算属性**: 需要根据运行时数据动态计算组件属性
|
|
350
|
+
3. **自定义事件处理**: 需要为组件添加自定义的事件处理函数
|
|
351
|
+
4. **复杂的数据联动**: 需要基于其他组件的值动态修改当前组件的配置
|
|
352
|
+
5. **自定义校验规则**: 需要添加低码平台不支持的复杂校验逻辑
|
|
353
|
+
|
|
354
|
+
#### 工作原理
|
|
355
|
+
|
|
356
|
+
`polyfillConfigs` 是一个对象,其键名是组件的 `hireRelat`(组件层级路径),值是一个函数,该函数返回需要补充或覆盖的配置属性。
|
|
357
|
+
|
|
358
|
+
```javascript
|
|
359
|
+
polyfillConfigs: {
|
|
360
|
+
'组件hireRelat路径': (config, instance, context) => {
|
|
361
|
+
return {
|
|
362
|
+
// 需要补充或覆盖的配置属性
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**参数说明**:
|
|
369
|
+
- `config`: 当前组件的配置对象
|
|
370
|
+
- `instance`: 当前组件的 Vue 实例
|
|
371
|
+
- `context`: 上下文对象,包含:
|
|
372
|
+
- `rootValue`: 当前页面的表单数据(ref 对象,需要通过 `.value` 访问)
|
|
373
|
+
- `dynamicMapComp`: 动态组件映射对象
|
|
374
|
+
- `parentRootValue`: 父级表单数据(仅在弹框页面场景下有值)
|
|
375
|
+
- `parentDynamicMapComp`: 父级动态组件映射(仅在弹框页面场景下有值)
|
|
376
|
+
|
|
377
|
+
**匹配规则**:
|
|
378
|
+
- 使用 `hireRelat.endsWith(key)` 进行匹配
|
|
379
|
+
- 如果多个键都匹配成功,选择层级最明确(路径最长)的配置
|
|
380
|
+
|
|
381
|
+
#### 完整示例
|
|
382
|
+
|
|
383
|
+
**场景**: 在用户表单中,需要根据用户类型动态设置字段的必填规则和可见性,这些复杂的业务逻辑在低码平台中无法配置。
|
|
384
|
+
|
|
385
|
+
```vue
|
|
386
|
+
<template>
|
|
387
|
+
<Resolver
|
|
388
|
+
ref="resolverRef"
|
|
389
|
+
:busiIdentityId="'PAGE_USER_FORM_001'"
|
|
390
|
+
v-model="formData"
|
|
391
|
+
:polyfillConfigs="polyfillConfigs"
|
|
392
|
+
:lang="lang"
|
|
393
|
+
:loadingInstance="loadingInstance"
|
|
394
|
+
:messageInstance="ElMessage"
|
|
395
|
+
/>
|
|
396
|
+
</template>
|
|
397
|
+
|
|
398
|
+
<script setup>
|
|
399
|
+
import { ref, computed } from 'vue'
|
|
400
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
401
|
+
import { ElMessage, ElLoading } from 'element-plus'
|
|
402
|
+
|
|
403
|
+
const resolverRef = ref(null)
|
|
404
|
+
const formData = ref({})
|
|
405
|
+
const lang = ref('zh')
|
|
406
|
+
|
|
407
|
+
// polyfillConfigs 配置补充
|
|
408
|
+
const polyfillConfigs = {
|
|
409
|
+
// 示例1: 为单个组件补充配置
|
|
410
|
+
'userType': (config, instance, context) => {
|
|
411
|
+
return {
|
|
412
|
+
// 动态设置必填规则
|
|
413
|
+
requiredFlag: '1',
|
|
414
|
+
// 添加自定义校验规则
|
|
415
|
+
validators: [
|
|
416
|
+
{
|
|
417
|
+
validator: (rule, value, callback) => {
|
|
418
|
+
if (value && !['admin', 'user', 'guest'].includes(value)) {
|
|
419
|
+
callback(new Error('用户类型不合法'))
|
|
420
|
+
} else {
|
|
421
|
+
callback()
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
trigger: 'change'
|
|
425
|
+
}
|
|
426
|
+
],
|
|
427
|
+
// 添加自定义事件
|
|
428
|
+
onChange: (value) => {
|
|
429
|
+
console.log('用户类型改变了:', value)
|
|
430
|
+
// 可以在这里触发其他逻辑
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
|
|
435
|
+
// 示例2: 为嵌套组件补充配置(使用完整路径)
|
|
436
|
+
'userForm->basicInfo->username': (config, instance, context) => {
|
|
437
|
+
// 通过 context.rootValue 获取当前页面的表单数据
|
|
438
|
+
const rootValue = context.rootValue?.value || {}
|
|
439
|
+
|
|
440
|
+
return {
|
|
441
|
+
// 根据用户类型动态设置必填
|
|
442
|
+
requiredFlag: rootValue.userType === 'admin' ? '1' : '0',
|
|
443
|
+
// 动态设置占位符
|
|
444
|
+
defPlacehold: rootValue.userType === 'admin'
|
|
445
|
+
? '请输入管理员账号'
|
|
446
|
+
: '请输入普通用户账号',
|
|
447
|
+
// 添加自定义校验
|
|
448
|
+
validators: [
|
|
449
|
+
{
|
|
450
|
+
validator: (rule, value, callback) => {
|
|
451
|
+
const userType = rootValue.userType
|
|
452
|
+
if (userType === 'admin' && value && value.length < 6) {
|
|
453
|
+
callback(new Error('管理员账号至少6位'))
|
|
454
|
+
} else {
|
|
455
|
+
callback()
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
trigger: 'blur'
|
|
459
|
+
}
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
|
|
464
|
+
// 示例3: 为多个同类型组件补充配置(使用通用路径)
|
|
465
|
+
'email': (config, instance, context) => {
|
|
466
|
+
return {
|
|
467
|
+
// 添加邮箱格式校验
|
|
468
|
+
validRegs: [
|
|
469
|
+
{
|
|
470
|
+
pattern: '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/',
|
|
471
|
+
message: '请输入正确的邮箱地址',
|
|
472
|
+
messageEn: 'Please enter a valid email address'
|
|
473
|
+
}
|
|
474
|
+
],
|
|
475
|
+
// 动态设置提示内容
|
|
476
|
+
hintFlag: '1',
|
|
477
|
+
hintContentZh: '请输入公司邮箱',
|
|
478
|
+
hintContentEn: 'Please enter your company email'
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
|
|
482
|
+
// 示例4: 动态控制组件显示/隐藏
|
|
483
|
+
'userForm->extraInfo->remark': (config, instance, context) => {
|
|
484
|
+
// 通过 context.rootValue 获取当前页面的表单数据
|
|
485
|
+
const rootValue = context.rootValue?.value || {}
|
|
486
|
+
const userType = rootValue.userType
|
|
487
|
+
|
|
488
|
+
return {
|
|
489
|
+
// 只有管理员才显示备注字段
|
|
490
|
+
hidden: userType === 'admin' ? '0' : '1',
|
|
491
|
+
// 动态设置标签
|
|
492
|
+
labelZh: userType === 'admin' ? '管理员备注' : '备注',
|
|
493
|
+
labelEn: userType === 'admin' ? 'Admin Remark' : 'Remark'
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
// 示例5: 为表格列补充配置
|
|
498
|
+
'userTable': (config, instance, context) => {
|
|
499
|
+
return {
|
|
500
|
+
// 添加自定义操作列
|
|
501
|
+
customColumns: [
|
|
502
|
+
{
|
|
503
|
+
label: '操作',
|
|
504
|
+
width: 150,
|
|
505
|
+
render: (row) => {
|
|
506
|
+
return [
|
|
507
|
+
h('el-button', {
|
|
508
|
+
type: 'primary',
|
|
509
|
+
size: 'small',
|
|
510
|
+
onClick: () => handleEdit(row)
|
|
511
|
+
}, '编辑'),
|
|
512
|
+
h('el-button', {
|
|
513
|
+
type: 'danger',
|
|
514
|
+
size: 'small',
|
|
515
|
+
onClick: () => handleDelete(row)
|
|
516
|
+
}, '删除')
|
|
517
|
+
]
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
]
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
// 处理编辑
|
|
526
|
+
const handleEdit = (row) => {
|
|
527
|
+
console.log('编辑:', row)
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// 处理删除
|
|
531
|
+
const handleDelete = (row) => {
|
|
532
|
+
console.log('删除:', row)
|
|
533
|
+
}
|
|
534
|
+
</script>
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
#### 简化示例
|
|
538
|
+
|
|
539
|
+
如果只需要为少量组件补充配置,可以使用简化的写法:
|
|
540
|
+
|
|
541
|
+
```vue
|
|
542
|
+
<script setup>
|
|
543
|
+
import { ref } from 'vue'
|
|
544
|
+
|
|
545
|
+
const polyfillConfigs = {
|
|
546
|
+
// 仅为特定组件添加自定义校验
|
|
547
|
+
'password': (config) => {
|
|
548
|
+
return {
|
|
549
|
+
validators: [
|
|
550
|
+
{
|
|
551
|
+
validator: (rule, value, callback) => {
|
|
552
|
+
if (value && value.length < 8) {
|
|
553
|
+
callback(new Error('密码长度不能少于8位'))
|
|
554
|
+
} else {
|
|
555
|
+
callback()
|
|
556
|
+
}
|
|
557
|
+
},
|
|
558
|
+
trigger: 'blur'
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
}
|
|
562
|
+
},
|
|
563
|
+
|
|
564
|
+
// 为手机号字段添加格式校验
|
|
565
|
+
'phone': (config) => {
|
|
566
|
+
return {
|
|
567
|
+
validRegs: [
|
|
568
|
+
{
|
|
569
|
+
pattern: '/^1[3-9]\\d{9}$/',
|
|
570
|
+
message: '请输入正确的手机号'
|
|
571
|
+
}
|
|
572
|
+
]
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
</script>
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
#### onVnodeMounted - 组件挂载生命周期
|
|
580
|
+
|
|
581
|
+
在 `polyfillConfigs` 中,经常需要使用 `onVnodeMounted` 钩子来执行组件挂载后的初始化逻辑。
|
|
582
|
+
|
|
583
|
+
**使用场景**:
|
|
584
|
+
- 组件渲染完成后执行初始化操作
|
|
585
|
+
- 获取 DOM 元素或组件实例
|
|
586
|
+
- 执行需要等待组件完全渲染后的逻辑
|
|
587
|
+
- 动态设置组件的初始值
|
|
588
|
+
- 触发自定义事件或服务调用
|
|
589
|
+
|
|
590
|
+
**使用方法**:
|
|
591
|
+
|
|
592
|
+
在 `polyfillConfigs` 返回的配置对象中添加 `onVnodeMounted` 属性:
|
|
593
|
+
|
|
594
|
+
```javascript
|
|
595
|
+
const polyfillConfigs = {
|
|
596
|
+
'componentCode': (config, instance, context) => {
|
|
597
|
+
return {
|
|
598
|
+
onVnodeMounted: (props, vnode, selects) => {
|
|
599
|
+
// 组件挂载后执行的逻辑
|
|
600
|
+
console.log('组件已挂载')
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
**参数说明**:
|
|
608
|
+
|
|
609
|
+
`onVnodeMounted` 函数接收三个参数:
|
|
610
|
+
|
|
611
|
+
1. **`props`** (Object)
|
|
612
|
+
- 组件的 props 对象
|
|
613
|
+
- 包含组件的所有配置属性
|
|
614
|
+
- 可以通过 `props.config` 访问组件的配置对象
|
|
615
|
+
- 可以通过 `props.modelValue` 访问组件的绑定值
|
|
616
|
+
|
|
617
|
+
2. **`vnode`** (VNode)
|
|
618
|
+
- Vue 的虚拟节点对象
|
|
619
|
+
- 代表当前渲染的组件实例
|
|
620
|
+
- 可以通过 `vnode.component` 访问组件实例
|
|
621
|
+
- 可以通过 `vnode.el` 访问 DOM 元素
|
|
622
|
+
|
|
623
|
+
3. **`selects`** (Object)
|
|
624
|
+
- 下拉选项数据对象
|
|
625
|
+
- 包含所有枚举数据
|
|
626
|
+
- 可以用于动态设置下拉选项
|
|
627
|
+
|
|
628
|
+
**`this` 上下文**:
|
|
629
|
+
|
|
630
|
+
在 `onVnodeMounted` 函数中,`this` 指向一个上下文对象,包含:
|
|
631
|
+
- `this.dataLoad`: 数据加载状态(Boolean),表示数据是否已加载完成
|
|
632
|
+
|
|
633
|
+
**完整示例**:
|
|
634
|
+
|
|
635
|
+
```vue
|
|
636
|
+
<script setup>
|
|
637
|
+
import { ref, nextTick } from 'vue'
|
|
638
|
+
|
|
639
|
+
const polyfillConfigs = {
|
|
640
|
+
// 示例1: 组件挂载后设置默认值
|
|
641
|
+
'username': (config, instance, context) => {
|
|
642
|
+
return {
|
|
643
|
+
onVnodeMounted: (props, vnode, selects) => {
|
|
644
|
+
// 访问组件配置
|
|
645
|
+
console.log('组件配置:', props.config)
|
|
646
|
+
|
|
647
|
+
// 访问表单数据
|
|
648
|
+
console.log('表单数据:', context.rootValue.value)
|
|
649
|
+
|
|
650
|
+
// 访问下拉选项
|
|
651
|
+
console.log('下拉选项:', selects)
|
|
652
|
+
|
|
653
|
+
// 访问数据加载状态
|
|
654
|
+
console.log('数据是否加载完成:', this.dataLoad)
|
|
655
|
+
|
|
656
|
+
// 设置默认值
|
|
657
|
+
if (!props.modelValue) {
|
|
658
|
+
props.config.refValue.value = '默认用户名'
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
},
|
|
663
|
+
|
|
664
|
+
// 示例2: 组件挂载后触发自定义逻辑
|
|
665
|
+
'userType': (config, instance, context) => {
|
|
666
|
+
return {
|
|
667
|
+
onVnodeMounted: (props, vnode, selects) => {
|
|
668
|
+
// 获取 DOM 元素
|
|
669
|
+
const el = vnode.el
|
|
670
|
+
console.log('DOM 元素:', el)
|
|
671
|
+
|
|
672
|
+
// 获取组件实例
|
|
673
|
+
const componentInstance = vnode.component
|
|
674
|
+
console.log('组件实例:', componentInstance)
|
|
675
|
+
|
|
676
|
+
// 根据数据加载状态执行不同逻辑
|
|
677
|
+
if (this.dataLoad) {
|
|
678
|
+
console.log('数据已加载,执行初始化逻辑')
|
|
679
|
+
// 执行需要数据加载完成后的逻辑
|
|
680
|
+
} else {
|
|
681
|
+
console.log('数据未加载,等待加载完成')
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
// 动态设置下拉选项
|
|
685
|
+
if (selects) {
|
|
686
|
+
console.log('可用选项:', selects.userTypeOptions)
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
},
|
|
691
|
+
|
|
692
|
+
// 示例3: 组件挂载后调用服务
|
|
693
|
+
'department': (config, instance, context) => {
|
|
694
|
+
return {
|
|
695
|
+
onVnodeMounted: async (props, vnode, selects) => {
|
|
696
|
+
// 等待 DOM 更新
|
|
697
|
+
await nextTick()
|
|
698
|
+
|
|
699
|
+
// 获取表单数据
|
|
700
|
+
const formData = context.rootValue.value
|
|
701
|
+
|
|
702
|
+
// 如果有用户ID,加载部门数据
|
|
703
|
+
if (formData.userId) {
|
|
704
|
+
console.log('加载用户部门数据:', formData.userId)
|
|
705
|
+
// 可以调用接口加载数据
|
|
706
|
+
// const deptData = await loadDepartmentData(formData.userId)
|
|
707
|
+
// props.config.refValue.value = deptData
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
},
|
|
712
|
+
|
|
713
|
+
// 示例4: 结合数据加载状态使用
|
|
714
|
+
'status': (config, instance, context) => {
|
|
715
|
+
return {
|
|
716
|
+
onVnodeMounted: (props, vnode, selects) => {
|
|
717
|
+
// 检查数据是否加载完成
|
|
718
|
+
const isDataLoaded = this.dataLoad
|
|
719
|
+
|
|
720
|
+
if (isDataLoaded) {
|
|
721
|
+
// 数据已加载,可以安全访问表单数据
|
|
722
|
+
const currentValue = context.rootValue.value.status
|
|
723
|
+
console.log('当前状态值:', currentValue)
|
|
724
|
+
|
|
725
|
+
// 根据当前值执行逻辑
|
|
726
|
+
if (currentValue === 'active') {
|
|
727
|
+
console.log('用户状态为活跃')
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
</script>
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
**简化示例**:
|
|
738
|
+
|
|
739
|
+
```javascript
|
|
740
|
+
const polyfillConfigs = {
|
|
741
|
+
'field': (config) => {
|
|
742
|
+
return {
|
|
743
|
+
onVnodeMounted: (props, vnode, selects) => {
|
|
744
|
+
// 最简单的使用方式
|
|
745
|
+
console.log('组件已挂载', props.config.metaCode)
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
**注意事项**:
|
|
753
|
+
|
|
754
|
+
1. **执行时机**: `onVnodeMounted` 在组件的 DOM 挂载完成后执行,此时可以安全访问 DOM 元素
|
|
755
|
+
2. **this 上下文**: 函数中的 `this` 不是指向组件实例,而是包含 `dataLoad` 的上下文对象
|
|
756
|
+
3. **异步操作**: 如需执行异步操作,可以将函数声明为 `async`
|
|
757
|
+
4. **错误处理**: 建议在 `onVnodeMounted` 中添加 try-catch 处理可能的错误
|
|
758
|
+
5. **与 onMounted 的区别**: `onVnodeMounted` 是 Vue 的 vnode 生命周期钩子,比组件的 `onMounted` 更早执行
|
|
759
|
+
|
|
760
|
+
#### 注意事项
|
|
761
|
+
|
|
762
|
+
1. **路径匹配**: `hireRelat` 是组件的层级路径,格式为 `父组件->子组件->孙组件`,路径越明确优先级越高
|
|
763
|
+
2. **属性覆盖**: `polyfillConfigs` 返回的属性会覆盖低码平台配置的相同属性
|
|
764
|
+
3. **性能考虑**: 避免在 `polyfillConfigs` 函数中执行耗时操作,会影响渲染性能
|
|
765
|
+
4. **访问表单数据**: 使用 `context.rootValue.value` 访问当前页面的表单数据
|
|
766
|
+
5. **弹框场景**: `context.parentRootValue` 和 `context.parentDynamicMapComp` 仅在弹框页面场景下才有值,普通页面请使用 `context.rootValue`
|
|
767
|
+
6. **调试技巧**: 可以在函数中 `console.log(config)` 查看当前组件的完整配置,便于调试
|
|
768
|
+
|
|
769
|
+
#### 与低码平台的协作流程
|
|
770
|
+
|
|
771
|
+
```
|
|
772
|
+
1. 在低码平台配置基础属性和布局
|
|
773
|
+
↓
|
|
774
|
+
2. 识别低码平台无法配置的部分
|
|
775
|
+
↓
|
|
776
|
+
3. 在代码中通过 polyfillConfigs 补充配置
|
|
777
|
+
↓
|
|
778
|
+
4. 渲染器自动合并低码配置和代码补充配置
|
|
779
|
+
↓
|
|
780
|
+
5. 最终渲染页面(代码补充配置优先级更高)
|
|
781
|
+
```
|
|
782
|
+
|
|
783
|
+
> **最佳实践**: 优先使用低码平台配置,只在必要时使用 `polyfillConfigs` 补充,保持配置的可维护性。
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## 全局通用属性
|
|
788
|
+
|
|
789
|
+
> **说明**: 以下属性所有组件都可以使用,在配置中直接设置即可。
|
|
790
|
+
|
|
791
|
+
### Form-Item 包裹说明
|
|
792
|
+
|
|
793
|
+
渲染器会根据配置自动决定是否使用 `form-item` 组件包裹表单元素,PC端和移动端的处理逻辑不同:
|
|
794
|
+
|
|
795
|
+
#### 默认需要 Form-Item 包裹的组件
|
|
796
|
+
|
|
797
|
+
以下类型的组件**默认会被 form-item 包裹**(无需额外配置):
|
|
798
|
+
|
|
799
|
+
**PC端 (Element Plus) 表单输入组件**:
|
|
800
|
+
- `ElInput` - 文本输入框(包括 `input`、`textarea`)
|
|
801
|
+
- `ElSelect` - 下拉选择框(`select`)
|
|
802
|
+
- `ElRadio` - 单选框(`radio`)
|
|
803
|
+
- `ElCheckbox` - 复选框(`checkbox`)
|
|
804
|
+
- `ElDatePicker` - 日期选择器(`date`、`date-range`)
|
|
805
|
+
- `ElTimePicker` - 时间选择器(`time`、`time-range`)
|
|
806
|
+
- `ElInputNumber` - 数字输入框(`number`)
|
|
807
|
+
- `ElCascader` - 级联选择器(`cascader`)
|
|
808
|
+
- `CustomComponentSelectEmployees` - 员工选择器(`select-employees`)
|
|
809
|
+
- `CustomComponentEditor` - 富文本编辑器(`rich-editor`)
|
|
810
|
+
- `CustomComponentTree` - 树形选择器(`tree`)
|
|
811
|
+
- `CustomComponentSteps` - 步骤条(`steps`)
|
|
812
|
+
|
|
813
|
+
**移动端 (H5) 表单输入组件**:
|
|
814
|
+
- `CmiInput` - 文本输入框
|
|
815
|
+
- `CmiSelect` - 下拉选择框
|
|
816
|
+
- `CmiPicker` - 选择器
|
|
817
|
+
- `CmiDatetimePicker` - 日期时间选择器(`cmi-datetime`)
|
|
818
|
+
- `CmiCheckbox` - 复选框
|
|
819
|
+
- `CmiRadio` - 单选框
|
|
820
|
+
- `CmiSearch` - 搜索框
|
|
821
|
+
|
|
822
|
+
> **说明**: 以上组件在配置中即使没有设置 `needformItem` 或 `showFormItem` 属性,也会自动被 form-item 包裹,因为它们属于表单输入类型,需要标签、校验等功能。
|
|
823
|
+
|
|
824
|
+
#### 默认不需要 Form-Item 包裹的组件
|
|
825
|
+
|
|
826
|
+
以下类型的组件**默认不会被 form-item 包裹**:
|
|
827
|
+
|
|
828
|
+
**PC端布局与容器组件**:
|
|
829
|
+
- `CustomComponentTabs` - 标签页(`tab`)
|
|
830
|
+
- `CustomComponentTabPane` - 标签页面板(`tab-pane`)
|
|
831
|
+
- `CustomComponentCycleTabPane` - 循环标签页面板
|
|
832
|
+
- `CustomComponentCollapse` - 折叠面板(`collapse`、`card`)
|
|
833
|
+
- `CustomComponentDialog` - 对话框
|
|
834
|
+
- `CustomComponentTable` - 表格(`table`、`checkbox-table`)
|
|
835
|
+
- `CustomComponentRow` - 行布局(`row`、`grid`)
|
|
836
|
+
- `CustomComponentCol` - 列布局(`grid-col`)
|
|
837
|
+
- `CustomComponentCycle` - 循环列表(`cycle`)
|
|
838
|
+
- `ElButton` - 按钮(`button`)
|
|
839
|
+
|
|
840
|
+
**移动端布局与容器组件**:
|
|
841
|
+
- `CustomComponentCardH5` - 卡片(`cmi-card`)
|
|
842
|
+
- `CustomComponentCollapseH5` - 折叠面板(`cmi-collapse`)
|
|
843
|
+
- `CustomComponentTabsH5` - 标签页(`cmi-tab`)
|
|
844
|
+
- `CustomComponentTabPaneH5` - 标签页面板(`cmi-tab-pane`)
|
|
845
|
+
- `CustomComponentTableH5` - 表格(`cmi-table`)
|
|
846
|
+
- `cmi-cell` - 单元格
|
|
847
|
+
- `cmi-button` - 按钮
|
|
848
|
+
- `cmi-link` - 链接
|
|
849
|
+
- `cmi-dropdown-menu` - 下拉菜单
|
|
850
|
+
- `cmi-divider` - 分割线
|
|
851
|
+
|
|
852
|
+
> **说明**: 这些组件属于布局容器、操作按钮或展示类组件,不需要表单校验和标签,因此默认不使用 form-item 包裹。
|
|
853
|
+
|
|
854
|
+
#### PC端 (Element Plus) 包裹规则
|
|
855
|
+
|
|
856
|
+
**默认行为**:
|
|
857
|
+
1. 表单输入类组件(见上方列表)自动被 `el-form-item` 包裹
|
|
858
|
+
2. 配置中设置了 `needformItem` 属性时会被包裹
|
|
859
|
+
3. 配置中设置了 `showFormItem = "1"` 或 `showFormItem = true` 时会被包裹
|
|
860
|
+
|
|
861
|
+
**不会被包裹的情况**:
|
|
862
|
+
- 布局容器类组件(见上方列表)默认不包裹
|
|
863
|
+
- 配置中设置了 `showFormItem = "0"` 或 `showFormItem = false`
|
|
864
|
+
- 表格列中的组件(`isColumn = true`),且没有校验规则(`rules`)且标签隐藏(`hidden-label`)
|
|
865
|
+
|
|
866
|
+
**特殊优化**: 如果组件没有校验规则(`rules.length === 0`),会使用轻量级的 `SimpleFormItemPc` 组件替代完整的 `el-form-item`,提升性能。
|
|
867
|
+
|
|
868
|
+
#### 移动端 (H5) 包裹规则
|
|
869
|
+
|
|
870
|
+
**默认行为**:
|
|
871
|
+
1. 表单输入类组件(见上方列表)自动被 `CmiFormItem` 包裹
|
|
872
|
+
2. 配置中设置了 `needformItem` 属性时会被包裹
|
|
873
|
+
3. 配置中设置了 `showFormItem = "1"` 或 `showFormItem = true` 时会被包裹
|
|
874
|
+
|
|
875
|
+
**不会被包裹的情况**:
|
|
876
|
+
- 布局容器类组件(见上方列表)默认不包裹
|
|
877
|
+
- 配置中设置了 `showFormItem = "0"` 或 `showFormItem = false`
|
|
878
|
+
- **特殊情况 - 转换为 Cell 展示**: 当满足以下所有条件时,移动端不会使用 `CmiFormItem` 包裹,而是直接渲染原生组件:
|
|
879
|
+
- `alwaysNative !== "1"`(未强制使用原生组件)
|
|
880
|
+
- 组件处于禁用状态(`disabled = true`)
|
|
881
|
+
- 组件类型是以下之一:`CmiInput`、`CmiSelect`、`CmiPicker`
|
|
882
|
+
|
|
883
|
+
> **提示**: 移动端在详情模式下(组件被禁用),输入框、下拉选择、选择器等组件会自动转换为纯文本展示,此时不需要 `CmiFormItem` 包裹。
|
|
884
|
+
|
|
885
|
+
#### 控制 Form-Item 包裹的配置示例
|
|
886
|
+
|
|
887
|
+
```json
|
|
888
|
+
{
|
|
889
|
+
"metaCode": "username",
|
|
890
|
+
"metaType": "ElInput",
|
|
891
|
+
"needformItem": true, // 明确需要 form-item 包裹
|
|
892
|
+
"showFormItem": "1" // 或者使用此属性
|
|
893
|
+
}
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
```json
|
|
897
|
+
{
|
|
898
|
+
"metaCode": "description",
|
|
899
|
+
"metaType": "ElInput",
|
|
900
|
+
"showFormItem": false // 不需要 form-item 包裹
|
|
901
|
+
}
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
```json
|
|
905
|
+
{
|
|
906
|
+
"metaCode": "status",
|
|
907
|
+
"metaType": "ElSelect",
|
|
908
|
+
"editFlag": "0", // 禁用状态
|
|
909
|
+
"alwaysNative": "1" // 移动端仍使用 CmiFormItem 包裹(不转换为 Cell)
|
|
910
|
+
}
|
|
911
|
+
```
|
|
912
|
+
|
|
913
|
+
### 基础属性
|
|
914
|
+
|
|
915
|
+
| 属性名 | 类型 | 说明 | 配置示例 |
|
|
916
|
+
|--------|------|------|----------|
|
|
917
|
+
| `metaCode` | String | 字段唯一编码 | `"username"` |
|
|
918
|
+
| `metaNameZh` | String | 中文名称 | `"用户名"` |
|
|
919
|
+
| `metaNameEn` | String | 英文名称 | `"Username"` |
|
|
920
|
+
| `metaType` | String | 组件类型 | `"input"`, `"select"` 等 |
|
|
921
|
+
| `displayType` | String | 显示类型 | `"1"`-显示, `"0"`-隐藏 |
|
|
922
|
+
| `editFlag` | String | 是否可编辑 | `"1"`-可编辑, `"0"`-禁用 |
|
|
923
|
+
| `requiredFlag` | String | 是否必填 | `"1"`-必填, `"0"`-非必填 |
|
|
924
|
+
| `clearableFlag` | String | 是否可清除 | `"1"`-可清除 |
|
|
925
|
+
| `hidden` | String/Boolean | 是否隐藏 | `"1"` 或 `true` |
|
|
926
|
+
| `seqNo` | Number | 排序号 | `1`, `2`, `3` |
|
|
927
|
+
| `width` | String/Number | 组件宽度 | `"100%"`, `200` |
|
|
928
|
+
| `defPlacehold` | String | 中文占位符 | `"请输入"` |
|
|
929
|
+
| `defPlaceholdEn` | String | 英文占位符 | `"Please enter"` |
|
|
930
|
+
| `selectKey` | String | 下拉选项key | `"status_options"` |
|
|
931
|
+
|
|
932
|
+
### 布局属性
|
|
933
|
+
|
|
934
|
+
| 属性名 | 类型 | 说明 | 配置示例 |
|
|
935
|
+
|--------|------|------|----------|
|
|
936
|
+
| `span` | Number | 栅格占位(1-24) | `12` (占50%) |
|
|
937
|
+
| `offset` | Number | 左侧偏移格数 | `2` |
|
|
938
|
+
| `md` | Number/Object | 中等屏幕占位 | `8` 或 `{span: 8}` |
|
|
939
|
+
| `lg` | Number/Object | 大屏幕占位 | `6` 或 `{span: 6}` |
|
|
940
|
+
| `elWidth` | String | 列宽度 | `"auto"`, `"self"`, `"200px"` |
|
|
941
|
+
| `isAllRow` | Boolean | 是否独占一行 | `true` |
|
|
942
|
+
| `removeCol` | Boolean | 移除列包裹 | `true` |
|
|
943
|
+
| `colTextAlign` | String | 文本对齐 | `"left"`, `"center"`, `"right"` |
|
|
944
|
+
| **边距属性** | | | |
|
|
945
|
+
| `marginRight` | String/Number | 右边距 | `"16px"`, `16` |
|
|
946
|
+
| `marginLeft` | String/Number | 左边距 | `"8px"` |
|
|
947
|
+
| `marginTop` | String/Number | 上边距 | `"10px"` |
|
|
948
|
+
| `marginBottom` | String/Number | 下边距 | `"12px"` |
|
|
949
|
+
| `paddingRight` | String/Number | 右内边距 | `"8px"` |
|
|
950
|
+
| `paddingLeft` | String/Number | 左内边距 | `"8px"` |
|
|
951
|
+
| `paddingTop` | String/Number | 上内边距 | `"4px"` |
|
|
952
|
+
| `paddingBottom` | String/Number | 下内边距 | `"4px"` |
|
|
953
|
+
| **样式属性** | | | |
|
|
954
|
+
| `defStyle` | String | 内联样式(JSON) | `'{"color": "red"}'` |
|
|
955
|
+
| `class` | String | CSS类名 | `"custom-class"` |
|
|
956
|
+
|
|
957
|
+
### 表单项属性
|
|
958
|
+
|
|
959
|
+
| 属性名 | 类型 | 说明 | 配置示例 |
|
|
960
|
+
|--------|------|------|----------|
|
|
961
|
+
| `labelZh` | String | 中文标签 | `"用户名"` |
|
|
962
|
+
| `labelEn` | String | 英文标签 | `"Username"` |
|
|
963
|
+
| `labelWidth` | String | 标签宽度 | `"100px"`, `"0"`(隐藏) |
|
|
964
|
+
| `labelHidden` | String | 隐藏标签 | `"1"` |
|
|
965
|
+
| `label-position` | String | 标签位置 | `"right"`, `"left"`, `"top"` |
|
|
966
|
+
| `labelVertical` | String | 标签垂直对齐 | `"center"`, `"top"`, `"bottom"` |
|
|
967
|
+
| `showLabel` | String | 显示标签 | `"1"` |
|
|
968
|
+
| `hiddenRequiredFlag` | String | 隐藏必填星号 | `"1"` |
|
|
969
|
+
| `onlyRequiredFlag` | String | 仅显示必填标识 | `"1"` |
|
|
970
|
+
| **提示属性** | | | |
|
|
971
|
+
| `hintFlag` | String | 显示提示图标 | `"1"` |
|
|
972
|
+
| `hintContentZh` | String | 提示内容(中文) | `"请输入用户名"` |
|
|
973
|
+
| `hintContentEn` | String | 提示内容(英文) | `"Please enter username"` |
|
|
974
|
+
| `hintType` | String | 提示图标类型 | `"info"`, `"warning"` |
|
|
975
|
+
| **表单项边距** | | | |
|
|
976
|
+
| `formItemMarginRight` | String/Number | 表单项右边距 | `"16px"` |
|
|
977
|
+
| `formItemMarginLeft` | String/Number | 表单项左边距 | `"8px"` |
|
|
978
|
+
| `formItemMarginTop` | String/Number | 表单项上边距 | `"10px"` |
|
|
979
|
+
| `formItemMarginBottom` | String/Number | 表单项下边距 | `"12px"` |
|
|
980
|
+
| `formItemPaddingRight` | String/Number | 表单项右内边距 | `"8px"` |
|
|
981
|
+
| `formItemPaddingLeft` | String/Number | 表单项左内边距 | `"8px"` |
|
|
982
|
+
| `formItemPaddingTop` | String/Number | 表单项上内边距 | `"4px"` |
|
|
983
|
+
| `formItemPaddingBottom` | String/Number | 表单项下内边距 | `"4px"` |
|
|
984
|
+
| **表单插槽** | | | |
|
|
985
|
+
| `formItemSlot` | String | 表单项插槽 | `"label"` |
|
|
986
|
+
| `formItemLabelSlot` | String | 标签插槽 | `"default"` |
|
|
987
|
+
| `showFormItem` | String/Boolean | 显示表单项 | `"1"` 或 `true` |
|
|
988
|
+
| `contentRight` | Boolean | 内容右对齐 | `true` |
|
|
989
|
+
|
|
990
|
+
### 校验属性
|
|
991
|
+
|
|
992
|
+
| 属性名 | 类型 | 说明 | 配置示例 |
|
|
993
|
+
|--------|------|------|----------|
|
|
994
|
+
| `requiredFlag` | String | 是否必填 | `"1"`-必填, `"0"`-非必填 |
|
|
995
|
+
| `alongValidate` | String | 禁用时是否校验 | `"1"` |
|
|
996
|
+
| **正则校验** | | | |
|
|
997
|
+
| `regexPattern` | String | 正则校验(JSON数组) | 见下方示例 |
|
|
998
|
+
| `validRegs` | Array/Object | 校验规则数组 | 见下方示例 |
|
|
999
|
+
| **自定义校验** | | | |
|
|
1000
|
+
| `validators` | Array | 自定义校验函数 | 见下方示例 |
|
|
1001
|
+
|
|
1002
|
+
#### regexPattern 示例
|
|
1003
|
+
|
|
1004
|
+
```json
|
|
1005
|
+
{
|
|
1006
|
+
"regexPattern": "[{\"pattern\":\"/^\\\\d+$/\",\"message\":\"只能输入数字\",\"messageEn\":\"Only numbers allowed\"}]"
|
|
1007
|
+
}
|
|
1008
|
+
```
|
|
1009
|
+
|
|
1010
|
+
#### validRegs 示例
|
|
1011
|
+
|
|
1012
|
+
```json
|
|
1013
|
+
{
|
|
1014
|
+
"validRegs": [
|
|
1015
|
+
{
|
|
1016
|
+
"pattern": "/^\\d+$/",
|
|
1017
|
+
"message": "只能输入数字",
|
|
1018
|
+
"messageEn": "Only numbers allowed"
|
|
1019
|
+
}
|
|
1020
|
+
]
|
|
1021
|
+
}
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
### 事件属性
|
|
1025
|
+
|
|
1026
|
+
| 属性名 | 类型 | 说明 | 配置示例 |
|
|
1027
|
+
|--------|------|------|----------|
|
|
1028
|
+
| `onClick` | Function | 点击事件 | `function(e) { console.log('clicked') }` |
|
|
1029
|
+
| `onMounted` | String/Function | 挂载完成事件 | 字符串或函数 |
|
|
1030
|
+
| `onVnodeMounted` | Function | VNode挂载事件 | `function(props, vnode, selects) {}` |
|
|
1031
|
+
| `onVnodeUnmounted` | Function | VNode卸载事件 | `function(props) {}` |
|
|
1032
|
+
| `onLabelClick` | Function | 标签点击事件 | `function(config) {}` |
|
|
1033
|
+
| `immediateClickEvent` | Boolean | 数据加载后自动点击 | `true` |
|
|
1034
|
+
|
|
1035
|
+
#### onMounted 字符串示例
|
|
1036
|
+
|
|
1037
|
+
```json
|
|
1038
|
+
{
|
|
1039
|
+
"onMounted": "console.log('组件已挂载', props.metaCode)"
|
|
1040
|
+
}
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
#### onClick 函数示例
|
|
1044
|
+
|
|
1045
|
+
```javascript
|
|
1046
|
+
{
|
|
1047
|
+
onClick: function(e, params) {
|
|
1048
|
+
console.log('点击事件', this.props)
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
### 服务编排属性
|
|
1054
|
+
|
|
1055
|
+
> **说明**: 这些属性用于配置按钮点击后的服务调用、弹窗打开等交互行为。
|
|
1056
|
+
|
|
1057
|
+
| 属性名 | 类型 | 说明 |
|
|
1058
|
+
|--------|------|------|
|
|
1059
|
+
| `lcpPageServiceMapVOList` | Array | 服务调用配置列表 |
|
|
1060
|
+
| `lcpPagePopupMapVO` | Object | 弹窗配置 |
|
|
1061
|
+
| `lcpPageRuleVOList` | Array | 数据校验规则 |
|
|
1062
|
+
| `lcpPageClosedMapVO` | Object | 页面关闭配置 |
|
|
1063
|
+
| **钩子函数** | | |
|
|
1064
|
+
| `beforeRequestService` | Function | 服务请求前钩子 |
|
|
1065
|
+
| `afterRequestService` | Function | 服务请求后钩子 |
|
|
1066
|
+
| `beforeOpenDialog` | Function | 打开弹窗前钩子 |
|
|
1067
|
+
| `afterOpenDialog` | Function | 关闭弹窗后钩子 |
|
|
1068
|
+
| `middleOpenDialog` | Function | 弹窗中间处理钩子 |
|
|
1069
|
+
| `beforeDataValidRequestService` | Function | 数据校验前钩子 |
|
|
1070
|
+
| `afterDataValidRequestService` | Function | 数据校验后钩子 |
|
|
1071
|
+
|
|
1072
|
+
#### 服务调用配置示例
|
|
1073
|
+
|
|
1074
|
+
```json
|
|
1075
|
+
{
|
|
1076
|
+
"lcpPageServiceMapVOList": [
|
|
1077
|
+
{
|
|
1078
|
+
"serviceCode": "/api/submit",
|
|
1079
|
+
"httpMethod": "post",
|
|
1080
|
+
"serviceType": "1",
|
|
1081
|
+
"transactionType": "1",
|
|
1082
|
+
"busiIdentityId": "biz_001",
|
|
1083
|
+
"inParamMappingList": [
|
|
1084
|
+
{"orignParam": "username", "destParam": "userName"}
|
|
1085
|
+
],
|
|
1086
|
+
"outParamMappingList": [
|
|
1087
|
+
{"orignParam": "result.data", "destParam": "result_field"}
|
|
1088
|
+
]
|
|
1089
|
+
}
|
|
1090
|
+
]
|
|
1091
|
+
}
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
---
|
|
1095
|
+
|
|
1096
|
+
## 表单输入组件
|
|
1097
|
+
|
|
1098
|
+
### ElInput - 文本输入框
|
|
1099
|
+
|
|
1100
|
+
**metaType**: `input`, `textarea`
|
|
1101
|
+
|
|
1102
|
+
#### 可配置属性
|
|
1103
|
+
|
|
1104
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1105
|
+
|--------|------|--------|------|----------|
|
|
1106
|
+
| `type` | String | text | 输入类型 | `"text"`, `"password"`, `"textarea"` |
|
|
1107
|
+
| `maxlength` | Number | - | 最大输入长度 | `50` |
|
|
1108
|
+
| `minlength` | Number | - | 最小输入长度 | `3` |
|
|
1109
|
+
| `show-word-limit` | Boolean | false | 显示字数统计 | `true` |
|
|
1110
|
+
| `prefix-icon` | String | - | 前缀图标 | `"User"` |
|
|
1111
|
+
| `suffix-icon` | String | - | 后缀图标 | `"Search"` |
|
|
1112
|
+
| `rows` | Number | 2 | textarea行数 | `4` |
|
|
1113
|
+
| `autosize` | Boolean/Object | false | 自适应高度 | `true` 或 `{minRows: 2, maxRows: 6}` |
|
|
1114
|
+
| `autocomplete` | String | off | 自动完成 | `"on"`, `"off"` |
|
|
1115
|
+
| `readonly` | Boolean | false | 只读 | `true` |
|
|
1116
|
+
| **扩展属性** | | | | |
|
|
1117
|
+
| `textAreaCnt` | Number | 2 | textarea行数 | `3` |
|
|
1118
|
+
| `maxLength` | Number | - | 最大长度(同maxlength) | `100` |
|
|
1119
|
+
| `icon` | String | - | 后缀图标(同suffix-icon) | `"Search"` |
|
|
1120
|
+
| `showTooltip` | String | '' | 超出显示tooltip | `"1"` |
|
|
1121
|
+
| **金额显示属性** | | | | |
|
|
1122
|
+
| `showMoney` | String | '' | 开启金额显示 | `"1"` |
|
|
1123
|
+
| `moneySeg` | String | ',' | 金额分割符 | `","` |
|
|
1124
|
+
| `min` | Number | -Infinity | 最小值 | `0` |
|
|
1125
|
+
| `max` | Number | Infinity | 最大值 | `999999` |
|
|
1126
|
+
| `decimal` | Number | 2 | 小数位数 | `2` |
|
|
1127
|
+
| `keepLastZero` | String | '0' | 保留小数后缀0 | `"1"` |
|
|
1128
|
+
| `canShowFlag` | Array | ['na', '-'] | 特殊值显示 | `["na", "-", "N/A"]` |
|
|
1129
|
+
| `showSymbol` | String | '' | 显示货币符号 | `"1"` |
|
|
1130
|
+
| `symbol` | String | '¥' | 货币符号 | `"¥"`, `"$"` |
|
|
1131
|
+
| `symbolPosition` | String | before | 符号位置 | `"before"`, `"after"` |
|
|
1132
|
+
| **弹窗交互** | | | | |
|
|
1133
|
+
| `onlyIconClickFlag` | String | '1' | 仅图标可点击弹窗 | `"1"` |
|
|
1134
|
+
| `pagePopupEditFlag` | String | '0' | 弹窗输入可编辑 | `"1"` |
|
|
1135
|
+
|
|
1136
|
+
#### 配置示例
|
|
1137
|
+
|
|
1138
|
+
**基础文本输入**
|
|
1139
|
+
```json
|
|
1140
|
+
{
|
|
1141
|
+
"metaCode": "username",
|
|
1142
|
+
"metaType": "input",
|
|
1143
|
+
"labelZh": "用户名",
|
|
1144
|
+
"requiredFlag": "1",
|
|
1145
|
+
"clearableFlag": "1",
|
|
1146
|
+
"maxLength": 50,
|
|
1147
|
+
"defPlacehold": "请输入用户名",
|
|
1148
|
+
"icon": "User"
|
|
1149
|
+
}
|
|
1150
|
+
```
|
|
1151
|
+
|
|
1152
|
+
**多行文本**
|
|
1153
|
+
```json
|
|
1154
|
+
{
|
|
1155
|
+
"metaCode": "remark",
|
|
1156
|
+
"metaType": "textarea",
|
|
1157
|
+
"labelZh": "备注",
|
|
1158
|
+
"textAreaCnt": 4,
|
|
1159
|
+
"maxLength": 500,
|
|
1160
|
+
"show-word-limit": true
|
|
1161
|
+
}
|
|
1162
|
+
```
|
|
1163
|
+
|
|
1164
|
+
**金额输入**
|
|
1165
|
+
```json
|
|
1166
|
+
{
|
|
1167
|
+
"metaCode": "amount",
|
|
1168
|
+
"metaType": "input",
|
|
1169
|
+
"labelZh": "金额",
|
|
1170
|
+
"showMoney": "1",
|
|
1171
|
+
"decimal": 2,
|
|
1172
|
+
"showSymbol": "1",
|
|
1173
|
+
"symbol": "¥",
|
|
1174
|
+
"symbolPosition": "before",
|
|
1175
|
+
"min": 0,
|
|
1176
|
+
"max": 999999
|
|
1177
|
+
}
|
|
1178
|
+
```
|
|
1179
|
+
|
|
1180
|
+
---
|
|
1181
|
+
|
|
1182
|
+
### ElSelect - 下拉选择框
|
|
1183
|
+
|
|
1184
|
+
**metaType**: `select`
|
|
1185
|
+
|
|
1186
|
+
#### 可配置属性
|
|
1187
|
+
|
|
1188
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1189
|
+
|--------|------|--------|------|----------|
|
|
1190
|
+
| `multiple` | String/Boolean | false | 多选 | `"1"` 或 `true` |
|
|
1191
|
+
| `filterable` | String/Boolean | false | 可搜索 | `"1"` 或 `true` |
|
|
1192
|
+
| `clearable` | Boolean | false | 可清除 | `true` |
|
|
1193
|
+
| `multiple-limit` | Number | 0 | 多选限制数量 | `3` |
|
|
1194
|
+
| `placeholder` | String | - | 占位符 | `"请选择"` |
|
|
1195
|
+
| `remote` | Boolean | false | 远程搜索 | `true` |
|
|
1196
|
+
| `loading` | Boolean | false | 加载中 | `true` |
|
|
1197
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1198
|
+
| **扩展属性** | | | | |
|
|
1199
|
+
| `multipleLimit` | String/Number | 0 | 多选限制 | `"5"` |
|
|
1200
|
+
| `rangeOptions` | Array | - | 范围选项(过滤) | `["1", "2"]` |
|
|
1201
|
+
| `excludeOptions` | Array | - | 排除选项(过滤) | `["0"]` |
|
|
1202
|
+
| `separator` | String | ',' | 多选分隔符 | `","` |
|
|
1203
|
+
| `virtualized` | String/Boolean | '' | 虚拟化滚动 | `"1"` |
|
|
1204
|
+
| `valueType` | String | string | 值类型 | `"list"`, `"object"`, `"string"` |
|
|
1205
|
+
| `selectKey` | String | - | 枚举数据key | `"status_options"` |
|
|
1206
|
+
|
|
1207
|
+
#### 选项数据结构
|
|
1208
|
+
|
|
1209
|
+
```javascript
|
|
1210
|
+
{
|
|
1211
|
+
columnValue: '1', // 选项值
|
|
1212
|
+
columnDesc_zh: '启用', // 中文描述
|
|
1213
|
+
columnDesc: 'Enabled', // 英文描述
|
|
1214
|
+
columnStatus: '1' // 状态: '0'-禁用, '1'-启用, '2'-隐藏
|
|
1215
|
+
}
|
|
1216
|
+
```
|
|
1217
|
+
|
|
1218
|
+
#### 配置示例
|
|
1219
|
+
|
|
1220
|
+
**单选下拉**
|
|
1221
|
+
```json
|
|
1222
|
+
{
|
|
1223
|
+
"metaCode": "status",
|
|
1224
|
+
"metaType": "select",
|
|
1225
|
+
"labelZh": "状态",
|
|
1226
|
+
"selectKey": "status_options",
|
|
1227
|
+
"filterable": "1",
|
|
1228
|
+
"clearableFlag": "1",
|
|
1229
|
+
"multiple": "0"
|
|
1230
|
+
}
|
|
1231
|
+
```
|
|
1232
|
+
|
|
1233
|
+
**多选下拉**
|
|
1234
|
+
```json
|
|
1235
|
+
{
|
|
1236
|
+
"metaCode": "tags",
|
|
1237
|
+
"metaType": "select",
|
|
1238
|
+
"labelZh": "标签",
|
|
1239
|
+
"selectKey": "tag_options",
|
|
1240
|
+
"multiple": "1",
|
|
1241
|
+
"filterable": "1",
|
|
1242
|
+
"separator": ",",
|
|
1243
|
+
"valueType": "list"
|
|
1244
|
+
}
|
|
1245
|
+
```
|
|
1246
|
+
|
|
1247
|
+
**虚拟化滚动(大数据量)**
|
|
1248
|
+
```json
|
|
1249
|
+
{
|
|
1250
|
+
"metaCode": "large_select",
|
|
1251
|
+
"metaType": "select",
|
|
1252
|
+
"labelZh": "城市",
|
|
1253
|
+
"selectKey": "city_options",
|
|
1254
|
+
"virtualized": "1",
|
|
1255
|
+
"filterable": "1"
|
|
1256
|
+
}
|
|
1257
|
+
```
|
|
1258
|
+
|
|
1259
|
+
---
|
|
1260
|
+
|
|
1261
|
+
### ElRadio - 单选框
|
|
1262
|
+
|
|
1263
|
+
**metaType**: `radio`
|
|
1264
|
+
|
|
1265
|
+
#### 可配置属性
|
|
1266
|
+
|
|
1267
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1268
|
+
|--------|------|--------|------|----------|
|
|
1269
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1270
|
+
| `size` | String | default | 尺寸 | `"large"`, `"default"`, `"small"` |
|
|
1271
|
+
| **扩展属性** | | | | |
|
|
1272
|
+
| `type` | String | default | 类型 | `"default"`, `"button"` |
|
|
1273
|
+
| `selectKey` | String | - | 枚举数据key | `"gender_options"` |
|
|
1274
|
+
|
|
1275
|
+
#### 配置示例
|
|
1276
|
+
|
|
1277
|
+
**默认样式**
|
|
1278
|
+
```json
|
|
1279
|
+
{
|
|
1280
|
+
"metaCode": "gender",
|
|
1281
|
+
"metaType": "radio",
|
|
1282
|
+
"labelZh": "性别",
|
|
1283
|
+
"selectKey": "gender_options"
|
|
1284
|
+
}
|
|
1285
|
+
```
|
|
1286
|
+
|
|
1287
|
+
**按钮样式**
|
|
1288
|
+
```json
|
|
1289
|
+
{
|
|
1290
|
+
"metaCode": "status",
|
|
1291
|
+
"metaType": "radio",
|
|
1292
|
+
"labelZh": "状态",
|
|
1293
|
+
"selectKey": "status_options",
|
|
1294
|
+
"type": "button"
|
|
1295
|
+
}
|
|
1296
|
+
```
|
|
1297
|
+
|
|
1298
|
+
---
|
|
1299
|
+
|
|
1300
|
+
### ElCheckbox - 复选框
|
|
1301
|
+
|
|
1302
|
+
**metaType**: `checkbox`
|
|
1303
|
+
|
|
1304
|
+
#### 可配置属性
|
|
1305
|
+
|
|
1306
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1307
|
+
|--------|------|--------|------|----------|
|
|
1308
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1309
|
+
| `size` | String | default | 尺寸 | `"large"`, `"small"` |
|
|
1310
|
+
| `true-value` | String/Number | - | 选中时的值 | `"1"` |
|
|
1311
|
+
| `false-value` | String/Number | - | 未选中时的值 | `"0"` |
|
|
1312
|
+
| **扩展属性** | | | | |
|
|
1313
|
+
| `notShowLabel` | String/Number | '0' | 不显示标签 | `"1"` |
|
|
1314
|
+
| `valueType` | String | string | 值类型 | `"list"`, `"string"` |
|
|
1315
|
+
| `selectKey` | String | - | 枚举数据key | `"hobby_options"` |
|
|
1316
|
+
|
|
1317
|
+
**说明**:
|
|
1318
|
+
- 当配置了 `selectKey` 或 `options` 时,自动渲染为多选组
|
|
1319
|
+
- 没有选项时,渲染为单个复选框
|
|
1320
|
+
- 默认 `true-value='1'`, `false-value='0'`
|
|
1321
|
+
|
|
1322
|
+
#### 配置示例
|
|
1323
|
+
|
|
1324
|
+
**多选组**
|
|
1325
|
+
```json
|
|
1326
|
+
{
|
|
1327
|
+
"metaCode": "hobbies",
|
|
1328
|
+
"metaType": "checkbox",
|
|
1329
|
+
"labelZh": "爱好",
|
|
1330
|
+
"selectKey": "hobby_options",
|
|
1331
|
+
"valueType": "list"
|
|
1332
|
+
}
|
|
1333
|
+
```
|
|
1334
|
+
|
|
1335
|
+
**单个复选框**
|
|
1336
|
+
```json
|
|
1337
|
+
{
|
|
1338
|
+
"metaCode": "agree",
|
|
1339
|
+
"metaType": "checkbox",
|
|
1340
|
+
"labelZh": "同意协议",
|
|
1341
|
+
"notShowLabel": "0"
|
|
1342
|
+
}
|
|
1343
|
+
```
|
|
1344
|
+
|
|
1345
|
+
---
|
|
1346
|
+
|
|
1347
|
+
### ElDatePicker - 日期选择器
|
|
1348
|
+
|
|
1349
|
+
**metaType**: `date`, `date-range`
|
|
1350
|
+
|
|
1351
|
+
#### 可配置属性
|
|
1352
|
+
|
|
1353
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1354
|
+
|--------|------|--------|------|----------|
|
|
1355
|
+
| `type` | String | date | 类型 | `"date"`, `"daterange"`, `"month"` |
|
|
1356
|
+
| `format` | String | YYYY-MM-DD | 显示格式 | `"YYYY-MM-DD"` |
|
|
1357
|
+
| `value-format` | String | YYYY-MM-DD | 值格式 | `"YYYY-MM-DD"` |
|
|
1358
|
+
| `placeholder` | String | - | 占位符 | `"请选择日期"` |
|
|
1359
|
+
| `start-placeholder` | String | - | 开始占位符 | `"开始日期"` |
|
|
1360
|
+
| `end-placeholder` | String | - | 结束占位符 | `"结束日期"` |
|
|
1361
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1362
|
+
| `clearable` | Boolean | true | 可清除 | `true` |
|
|
1363
|
+
| **扩展属性** | | | | |
|
|
1364
|
+
| `min` | Date/String | null | 最小可选日期 | `"2024-01-01"` |
|
|
1365
|
+
| `max` | Date/String | null | 最大可选日期 | `"2024-12-31"` |
|
|
1366
|
+
| `displayType` | String | - | 日期类型(覆盖type) | `"daterange"` |
|
|
1367
|
+
| `prefix-icon` | String/Object | - | 前缀图标 | `"Calendar"` |
|
|
1368
|
+
|
|
1369
|
+
**说明**:
|
|
1370
|
+
- `date-range` 类型自动设置 `type='daterange'` 和 `isRange=true`
|
|
1371
|
+
- 默认 `value-format='YYYY-MM-DD'`
|
|
1372
|
+
- 支持时间戳格式: `value-format='x'` 或 `value-format='timestamp'`
|
|
1373
|
+
|
|
1374
|
+
#### 配置示例
|
|
1375
|
+
|
|
1376
|
+
**单个日期**
|
|
1377
|
+
```json
|
|
1378
|
+
{
|
|
1379
|
+
"metaCode": "birthday",
|
|
1380
|
+
"metaType": "date",
|
|
1381
|
+
"labelZh": "生日",
|
|
1382
|
+
"format": "YYYY-MM-DD",
|
|
1383
|
+
"value-format": "YYYY-MM-DD"
|
|
1384
|
+
}
|
|
1385
|
+
```
|
|
1386
|
+
|
|
1387
|
+
**日期范围**
|
|
1388
|
+
```json
|
|
1389
|
+
{
|
|
1390
|
+
"metaCode": "date_range",
|
|
1391
|
+
"metaType": "date-range",
|
|
1392
|
+
"labelZh": "日期范围",
|
|
1393
|
+
"min": "2024-01-01",
|
|
1394
|
+
"max": "2024-12-31"
|
|
1395
|
+
}
|
|
1396
|
+
```
|
|
1397
|
+
|
|
1398
|
+
---
|
|
1399
|
+
|
|
1400
|
+
### ElTimePicker - 时间选择器
|
|
1401
|
+
|
|
1402
|
+
**metaType**: `time`, `time-range`
|
|
1403
|
+
|
|
1404
|
+
#### 可配置属性
|
|
1405
|
+
|
|
1406
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1407
|
+
|--------|------|--------|------|----------|
|
|
1408
|
+
| `type` | String | - | 类型 | `"time"` |
|
|
1409
|
+
| `format` | String | HH:mm:ss | 显示格式 | `"HH:mm"` |
|
|
1410
|
+
| `value-format` | String | - | 值格式 | `"HH:mm:ss"` |
|
|
1411
|
+
| `placeholder` | String | - | 占位符 | `"请选择时间"` |
|
|
1412
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1413
|
+
| `clearable` | Boolean | true | 可清除 | `true` |
|
|
1414
|
+
|
|
1415
|
+
#### 配置示例
|
|
1416
|
+
|
|
1417
|
+
```json
|
|
1418
|
+
{
|
|
1419
|
+
"metaCode": "start_time",
|
|
1420
|
+
"metaType": "time",
|
|
1421
|
+
"labelZh": "开始时间",
|
|
1422
|
+
"format": "HH:mm"
|
|
1423
|
+
}
|
|
1424
|
+
```
|
|
1425
|
+
|
|
1426
|
+
---
|
|
1427
|
+
|
|
1428
|
+
### ElInputNumber - 数字输入框
|
|
1429
|
+
|
|
1430
|
+
**metaType**: `number`
|
|
1431
|
+
|
|
1432
|
+
#### 可配置属性
|
|
1433
|
+
|
|
1434
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1435
|
+
|--------|------|--------|------|----------|
|
|
1436
|
+
| `min` | Number | -Infinity | 最小值 | `0` |
|
|
1437
|
+
| `max` | Number | Infinity | 最大值 | `100` |
|
|
1438
|
+
| `step` | Number | 1 | 步长 | `1` |
|
|
1439
|
+
| `precision` | Number | - | 精度(小数位数) | `2` |
|
|
1440
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1441
|
+
| `controls` | Boolean | true | 显示控制按钮 | `false` |
|
|
1442
|
+
| `controls-position` | String | - | 控制按钮位置 | `"right"` |
|
|
1443
|
+
| **扩展属性** | | | | |
|
|
1444
|
+
| `textAlign` | String | - | 文本对齐 | `"left"`, `"right"` |
|
|
1445
|
+
| `step` | String/Number | 1 | 步长 | `0.5` |
|
|
1446
|
+
| `precision` | String/Number | - | 精度 | `2` |
|
|
1447
|
+
| `maxValue` | Number | - | 最大值(同max) | `1000` |
|
|
1448
|
+
| `minValue` | Number | - | 最小值(同min) | `0` |
|
|
1449
|
+
| `precise` | Number | - | 精度(同precision) | `2` |
|
|
1450
|
+
|
|
1451
|
+
#### 配置示例
|
|
1452
|
+
|
|
1453
|
+
```json
|
|
1454
|
+
{
|
|
1455
|
+
"metaCode": "quantity",
|
|
1456
|
+
"metaType": "number",
|
|
1457
|
+
"labelZh": "数量",
|
|
1458
|
+
"minValue": 0,
|
|
1459
|
+
"maxValue": 100,
|
|
1460
|
+
"step": 1,
|
|
1461
|
+
"precise": 0,
|
|
1462
|
+
"textAlign": "right"
|
|
1463
|
+
}
|
|
1464
|
+
```
|
|
1465
|
+
|
|
1466
|
+
---
|
|
1467
|
+
|
|
1468
|
+
## 按钮与文本组件
|
|
1469
|
+
|
|
1470
|
+
### ElButton - 按钮
|
|
1471
|
+
|
|
1472
|
+
**metaType**: `button`
|
|
1473
|
+
|
|
1474
|
+
#### 可配置属性
|
|
1475
|
+
|
|
1476
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1477
|
+
|--------|------|--------|------|----------|
|
|
1478
|
+
| `type` | String | default | 类型 | `"primary"`, `"success"`, `"warning"`, `"danger"` |
|
|
1479
|
+
| `size` | String | default | 尺寸 | `"large"`, `"default"`, `"small"` |
|
|
1480
|
+
| `plain` | Boolean | false | 朴素按钮 | `true` |
|
|
1481
|
+
| `round` | Boolean | false | 圆角按钮 | `true` |
|
|
1482
|
+
| `circle` | Boolean | false | 圆形按钮 | `true` |
|
|
1483
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1484
|
+
| `loading` | Boolean | false | 加载状态 | `true` |
|
|
1485
|
+
| `icon` | String/Object | - | 图标 | `"Search"` |
|
|
1486
|
+
| **扩展属性** | | | | |
|
|
1487
|
+
| `plain` | String/Number/Boolean | false | 朴素按钮 | `"1"` |
|
|
1488
|
+
| `circle` | String/Number/Boolean | false | 圆形按钮 | `"1"` |
|
|
1489
|
+
| `size` | String | - | 按钮尺寸 | `"large"` |
|
|
1490
|
+
| `displayType` | String | - | 按钮类型(覆盖type) | `"primary"` |
|
|
1491
|
+
| `rounds` | String/Boolean | - | 圆角按钮 | `"1"` |
|
|
1492
|
+
| `icon` | String | - | 图标 | `"Plus"` |
|
|
1493
|
+
| `clickActionKey` | String | - | 点击动作key | `"submit"` |
|
|
1494
|
+
| `buttonActionKey` | String | - | 按钮动作key | `"save"` |
|
|
1495
|
+
| `widgetSize` | String | - | 组件尺寸 | `"def"`, `"large"`, `"small"` |
|
|
1496
|
+
|
|
1497
|
+
#### 配置示例
|
|
1498
|
+
|
|
1499
|
+
```json
|
|
1500
|
+
{
|
|
1501
|
+
"metaCode": "submit_btn",
|
|
1502
|
+
"metaType": "button",
|
|
1503
|
+
"labelZh": "提交",
|
|
1504
|
+
"displayType": "primary",
|
|
1505
|
+
"widgetSize": "large",
|
|
1506
|
+
"rounds": "1",
|
|
1507
|
+
"lcpPageServiceMapVOList": [
|
|
1508
|
+
{
|
|
1509
|
+
"serviceCode": "/api/submit",
|
|
1510
|
+
"httpMethod": "post",
|
|
1511
|
+
"transactionType": "1"
|
|
1512
|
+
}
|
|
1513
|
+
]
|
|
1514
|
+
}
|
|
1515
|
+
```
|
|
1516
|
+
|
|
1517
|
+
---
|
|
1518
|
+
|
|
1519
|
+
### ElText - 静态文本
|
|
1520
|
+
|
|
1521
|
+
**metaType**: `static-text`
|
|
1522
|
+
|
|
1523
|
+
#### 可配置属性
|
|
1524
|
+
|
|
1525
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1526
|
+
|--------|------|--------|------|----------|
|
|
1527
|
+
| `type` | String | - | 类型 | `"primary"`, `"success"`, `"warning"` |
|
|
1528
|
+
| `size` | String | default | 尺寸 | `"large"`, `"default"`, `"small"` |
|
|
1529
|
+
| `truncated` | Boolean | false | 截断文本 | `true` |
|
|
1530
|
+
| `tag` | String | span | HTML标签 | `"p"`, `"div"` |
|
|
1531
|
+
| **扩展属性** | | | | |
|
|
1532
|
+
| `fontSize` | String/Number | - | 字体大小 | `"14px"`, `14` |
|
|
1533
|
+
| `needWrap` | String/Number | '0' | 显示包裹容器 | `"1"` |
|
|
1534
|
+
| `suffixIcon` | String/Object | '' | 后缀图标 | `"ArrowRight"` |
|
|
1535
|
+
| `isPointer` | String/Number | - | 鼠标指针样式 | `"1"` |
|
|
1536
|
+
| `showTooltip` | String/Number | '0' | 超出显示tooltip | `"1"` |
|
|
1537
|
+
| `truncated` | String/Number/Boolean | '0' | 文本截断 | `"1"` |
|
|
1538
|
+
|
|
1539
|
+
#### 配置示例
|
|
1540
|
+
|
|
1541
|
+
```json
|
|
1542
|
+
{
|
|
1543
|
+
"metaCode": "info_text",
|
|
1544
|
+
"metaType": "static-text",
|
|
1545
|
+
"labelZh": "提示信息",
|
|
1546
|
+
"truncated": "1",
|
|
1547
|
+
"showTooltip": "1"
|
|
1548
|
+
}
|
|
1549
|
+
```
|
|
1550
|
+
|
|
1551
|
+
---
|
|
1552
|
+
|
|
1553
|
+
## 布局组件
|
|
1554
|
+
|
|
1555
|
+
### CustomComponentFormLayout - 表单布局
|
|
1556
|
+
|
|
1557
|
+
**metaType**: `CustomComponentFormLayout`
|
|
1558
|
+
|
|
1559
|
+
#### 可配置属性
|
|
1560
|
+
|
|
1561
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1562
|
+
|--------|------|--------|------|----------|
|
|
1563
|
+
| `model` | Object | - | 表单数据对象 | `{}` |
|
|
1564
|
+
| `rules` | Object | - | 表单验证规则 | `{}` |
|
|
1565
|
+
| `inline` | Boolean | false | 行内表单 | `true` |
|
|
1566
|
+
| `label-position` | String | right | 标签位置 | `"right"`, `"left"`, `"top"` |
|
|
1567
|
+
| `label-width` | String | - | 标签宽度 | `"100px"` |
|
|
1568
|
+
| `size` | String | default | 尺寸 | `"large"`, `"small"` |
|
|
1569
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1570
|
+
| `gutter` | Number | 0 | 栅格间隔 | `16` |
|
|
1571
|
+
| `justify` | String | start | 水平对齐 | `"start"`, `"center"`, `"end"` |
|
|
1572
|
+
| `align` | String | top | 垂直对齐 | `"top"`, `"middle"`, `"bottom"` |
|
|
1573
|
+
| **扩展属性** | | | | |
|
|
1574
|
+
| `span` | Number | 24 | 栅格占位 | `24` |
|
|
1575
|
+
| `rootForm` | Boolean | true | 是否为根表单 | `true` |
|
|
1576
|
+
| `labelWidth` | String | 84px/120px | 标签宽度(根据语言) | `"100px"` |
|
|
1577
|
+
|
|
1578
|
+
#### 配置示例
|
|
1579
|
+
|
|
1580
|
+
```json
|
|
1581
|
+
{
|
|
1582
|
+
"metaType": "CustomComponentFormLayout",
|
|
1583
|
+
"span": 24,
|
|
1584
|
+
"labelWidth": "100px",
|
|
1585
|
+
"label-position": "right",
|
|
1586
|
+
"inline": true,
|
|
1587
|
+
"pmPageMetaList": []
|
|
1588
|
+
}
|
|
1589
|
+
```
|
|
1590
|
+
|
|
1591
|
+
---
|
|
1592
|
+
|
|
1593
|
+
### CustomComponentTabs - 标签页
|
|
1594
|
+
|
|
1595
|
+
**metaType**: `tab`
|
|
1596
|
+
|
|
1597
|
+
#### 可配置属性
|
|
1598
|
+
|
|
1599
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1600
|
+
|--------|------|--------|------|----------|
|
|
1601
|
+
| `type` | String | - | 风格类型 | `"card"`, `"border-card"` |
|
|
1602
|
+
| `tab-position` | String | top | 标签位置 | `"top"`, `"right"`, `"bottom"`, `"left"` |
|
|
1603
|
+
| `stretch` | Boolean | false | 标签宽度自撑 | `true` |
|
|
1604
|
+
| **扩展属性** | | | | |
|
|
1605
|
+
| `showBar` | Boolean | true | 显示标签栏 | `true` |
|
|
1606
|
+
| `hiddenHeadUnderline` | String/Number | '0' | 隐藏头部下划线 | `"1"` |
|
|
1607
|
+
| `autoHeader` | String | - | 自动头部 | `"1"` |
|
|
1608
|
+
| `level` | Number | 1 | 层级 | `1`, `2`, `3` |
|
|
1609
|
+
|
|
1610
|
+
**层级说明**:
|
|
1611
|
+
- `level=1`: `type='border-card'`, `stretch=true`
|
|
1612
|
+
- `level=2`: 默认样式
|
|
1613
|
+
- `level=3`: `type='card'`
|
|
1614
|
+
|
|
1615
|
+
#### TabPane 配置 (子项)
|
|
1616
|
+
|
|
1617
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1618
|
+
|--------|------|--------|------|----------|
|
|
1619
|
+
| `metaType` | String | tab-pane | 页签类型 | `"tab-pane"` |
|
|
1620
|
+
| `labelZh` | String | - | 中文标签 | `"基本信息"` |
|
|
1621
|
+
| `labelEn` | String | - | 英文标签 | `"Basic Info"` |
|
|
1622
|
+
| `defaultShowFlag` | String | '0' | 默认显示 | `"1"` |
|
|
1623
|
+
| `isCycle` | String | '0' | 是否循环 | `"1"` |
|
|
1624
|
+
| `currentCode` | String | - | 当前激活编码 | `"tab1"` |
|
|
1625
|
+
| `tabExtendAttr` | Object | - | 标签扩展属性 | `{}` |
|
|
1626
|
+
|
|
1627
|
+
#### 配置示例
|
|
1628
|
+
|
|
1629
|
+
```json
|
|
1630
|
+
{
|
|
1631
|
+
"metaCode": "main_tabs",
|
|
1632
|
+
"metaType": "tab",
|
|
1633
|
+
"level": 1,
|
|
1634
|
+
"pmPageMetaList": [
|
|
1635
|
+
{
|
|
1636
|
+
"metaCode": "tab1",
|
|
1637
|
+
"metaType": "tab-pane",
|
|
1638
|
+
"labelZh": "基本信息",
|
|
1639
|
+
"defaultShowFlag": "1",
|
|
1640
|
+
"pmPageMetaList": []
|
|
1641
|
+
},
|
|
1642
|
+
{
|
|
1643
|
+
"metaCode": "tab2",
|
|
1644
|
+
"metaType": "tab-pane",
|
|
1645
|
+
"labelZh": "详细信息",
|
|
1646
|
+
"pmPageMetaList": []
|
|
1647
|
+
}
|
|
1648
|
+
]
|
|
1649
|
+
}
|
|
1650
|
+
```
|
|
1651
|
+
|
|
1652
|
+
---
|
|
1653
|
+
|
|
1654
|
+
### CustomComponentCollapse - 折叠面板
|
|
1655
|
+
|
|
1656
|
+
**metaType**: `collapse`, `card`
|
|
1657
|
+
|
|
1658
|
+
#### 可配置属性
|
|
1659
|
+
|
|
1660
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1661
|
+
|--------|------|--------|------|----------|
|
|
1662
|
+
| `accordion` | Boolean | false | 手风琴模式 | `true` |
|
|
1663
|
+
| `modelValue` | Array/String | - | 激活面板 | `"panel1"` |
|
|
1664
|
+
| `name` | String/Number | - | 面板标识 | `"panel1"` |
|
|
1665
|
+
| `title` | String | - | 面板标题 | `"基本信息"` |
|
|
1666
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1667
|
+
| `header` | String | - | 标题 | `"标题"` |
|
|
1668
|
+
| `footer` | String | - | 底栏 | `""` |
|
|
1669
|
+
| `shadow` | String | always | 阴影显示 | `"always"`, `"hover"`, `"never"` |
|
|
1670
|
+
| **扩展属性** | | | | |
|
|
1671
|
+
| `showSegment` | String | '0' | 显示分割线 | `"1"` |
|
|
1672
|
+
| `defaultOpenFlag` | String | '0' | 默认展开 | `"1"` |
|
|
1673
|
+
| `noCollpase` | String | '0' | 禁止折叠 | `"1"` |
|
|
1674
|
+
| `hiddenHead` | String | '0' | 隐藏头部 | `"1"` |
|
|
1675
|
+
| `hiddenHeadFlag` | String | '0' | 隐藏头部绿标 | `"1"` |
|
|
1676
|
+
| `needWrap` | String/Boolean | - | 使用卡片包裹 | `"1"` 或 `true` |
|
|
1677
|
+
| `needSegment` | Boolean | - | 显示边框 | `true` |
|
|
1678
|
+
| `underlineHidden` | Boolean | - | 隐藏下划线 | `true` |
|
|
1679
|
+
| `collapseHidden` | String | '0' | 折叠隐藏 | `"1"` |
|
|
1680
|
+
| `collapseSlot` | String | - | 标题插槽 | `"title"` |
|
|
1681
|
+
| `collapseRightSlot` | String | - | 标题右侧插槽 | `"extra"` |
|
|
1682
|
+
|
|
1683
|
+
#### 配置示例
|
|
1684
|
+
|
|
1685
|
+
```json
|
|
1686
|
+
{
|
|
1687
|
+
"metaCode": "info_collapse",
|
|
1688
|
+
"metaType": "collapse",
|
|
1689
|
+
"metaNameZh": "基本信息",
|
|
1690
|
+
"defaultOpenFlag": "1",
|
|
1691
|
+
"needWrap": "1",
|
|
1692
|
+
"showSegment": "1",
|
|
1693
|
+
"pmPageMetaList": []
|
|
1694
|
+
}
|
|
1695
|
+
```
|
|
1696
|
+
|
|
1697
|
+
---
|
|
1698
|
+
|
|
1699
|
+
### CustomComponentDialog - 对话框
|
|
1700
|
+
|
|
1701
|
+
**metaType**: `CustomComponentDialog`
|
|
1702
|
+
|
|
1703
|
+
#### 可配置属性
|
|
1704
|
+
|
|
1705
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1706
|
+
|--------|------|--------|------|----------|
|
|
1707
|
+
| `modelValue` | Boolean | false | 是否显示 | `true` |
|
|
1708
|
+
| `title` | String | - | 标题 | `"详情"` |
|
|
1709
|
+
| `width` | String | 50% | 宽度 | `"600px"` |
|
|
1710
|
+
| `fullscreen` | Boolean | false | 全屏 | `true` |
|
|
1711
|
+
| `top` | String | 15vh | 顶部距离 | `"10vh"` |
|
|
1712
|
+
| `modal` | Boolean | true | 遮罩层 | `true` |
|
|
1713
|
+
| `append-to-body` | Boolean | false | 插入到body | `true` |
|
|
1714
|
+
| `lock-scroll` | Boolean | true | 锁定滚动 | `true` |
|
|
1715
|
+
| `close-on-click-modal` | Boolean | true | 点击遮罩关闭 | `false` |
|
|
1716
|
+
| `close-on-press-escape` | Boolean | true | ESC关闭 | `true` |
|
|
1717
|
+
| `show-close` | Boolean | true | 显示关闭按钮 | `true` |
|
|
1718
|
+
| `before-close` | Function | - | 关闭前回调 | 函数 |
|
|
1719
|
+
| `draggable` | Boolean | false | 可拖拽 | `true` |
|
|
1720
|
+
| `align-center` | Boolean | false | 居中对齐 | `true` |
|
|
1721
|
+
| `destroy-on-close` | Boolean | false | 关闭销毁 | `true` |
|
|
1722
|
+
| **扩展属性** | | | | |
|
|
1723
|
+
| `titleEn` | String | '' | 英文标题 | `"Detail"` |
|
|
1724
|
+
| `showConfirmButton` | String/Boolean | - | 显示确认按钮 | `"1"` 或 `true` |
|
|
1725
|
+
| `showConfirm` | String/Boolean | - | 显示确认按钮(别名) | `"1"` |
|
|
1726
|
+
| `showCloseButton` | String/Boolean | - | 显示关闭按钮 | `"1"` |
|
|
1727
|
+
| `showClose` | String/Boolean | true | 显示关闭按钮(别名) | `true` |
|
|
1728
|
+
| `dialogVisible` | Boolean | - | 对话框显示状态 | `false` |
|
|
1729
|
+
| `handlePromise` | Promise | - | 处理Promise | Promise对象 |
|
|
1730
|
+
|
|
1731
|
+
#### 配置示例
|
|
1732
|
+
|
|
1733
|
+
```json
|
|
1734
|
+
{
|
|
1735
|
+
"metaCode": "detail_dialog",
|
|
1736
|
+
"metaType": "CustomComponentDialog",
|
|
1737
|
+
"title": "详情",
|
|
1738
|
+
"titleEn": "Detail",
|
|
1739
|
+
"width": "600px",
|
|
1740
|
+
"showConfirmButton": "1",
|
|
1741
|
+
"showCloseButton": "1",
|
|
1742
|
+
"dialogVisible": false,
|
|
1743
|
+
"pmPageMetaList": []
|
|
1744
|
+
}
|
|
1745
|
+
```
|
|
1746
|
+
|
|
1747
|
+
---
|
|
1748
|
+
|
|
1749
|
+
### CustomComponentCycle - 循环列表
|
|
1750
|
+
|
|
1751
|
+
**metaType**: `cycle`
|
|
1752
|
+
|
|
1753
|
+
#### 可配置属性
|
|
1754
|
+
|
|
1755
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1756
|
+
|--------|------|--------|------|----------|
|
|
1757
|
+
| `needWrap` | Boolean/String | true | 使用卡片包裹 | `true` 或 `"1"` |
|
|
1758
|
+
| `multiPmPageMetaList` | Array | - | 多行配置(自动生成) | `[]` |
|
|
1759
|
+
|
|
1760
|
+
**说明**:
|
|
1761
|
+
- 循环列表根据数据数组动态生成多行配置
|
|
1762
|
+
- 每行数据对应独立的配置实例
|
|
1763
|
+
- 数据路径格式: `field[0]->subField`, `field[1]->subField`
|
|
1764
|
+
|
|
1765
|
+
#### 配置示例
|
|
1766
|
+
|
|
1767
|
+
```json
|
|
1768
|
+
{
|
|
1769
|
+
"metaCode": "items",
|
|
1770
|
+
"metaType": "cycle",
|
|
1771
|
+
"metaNameZh": "明细列表",
|
|
1772
|
+
"needWrap": true,
|
|
1773
|
+
"pmPageMetaList": [
|
|
1774
|
+
{
|
|
1775
|
+
"metaCode": "item_name",
|
|
1776
|
+
"metaType": "input",
|
|
1777
|
+
"labelZh": "项目名称"
|
|
1778
|
+
},
|
|
1779
|
+
{
|
|
1780
|
+
"metaCode": "item_amount",
|
|
1781
|
+
"metaType": "number",
|
|
1782
|
+
"labelZh": "金额"
|
|
1783
|
+
}
|
|
1784
|
+
]
|
|
1785
|
+
}
|
|
1786
|
+
```
|
|
1787
|
+
|
|
1788
|
+
对应的数据结构:
|
|
1789
|
+
|
|
1790
|
+
```javascript
|
|
1791
|
+
{
|
|
1792
|
+
items: [
|
|
1793
|
+
{ item_name: '项目A', item_amount: 1000 },
|
|
1794
|
+
{ item_name: '项目B', item_amount: 2000 }
|
|
1795
|
+
]
|
|
1796
|
+
}
|
|
1797
|
+
```
|
|
1798
|
+
|
|
1799
|
+
---
|
|
1800
|
+
|
|
1801
|
+
## 数据展示组件
|
|
1802
|
+
|
|
1803
|
+
### CustomComponentTable - 表格
|
|
1804
|
+
|
|
1805
|
+
**metaType**: `table`, `checkbox-table`
|
|
1806
|
+
|
|
1807
|
+
#### 可配置属性
|
|
1808
|
+
|
|
1809
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1810
|
+
|--------|------|--------|------|----------|
|
|
1811
|
+
| `data` | Array | [] | 表格数据 | `[]` |
|
|
1812
|
+
| `height` | String/Number | - | 高度 | `400`, `"400px"` |
|
|
1813
|
+
| `max-height` | String/Number | - | 最大高度 | `500` |
|
|
1814
|
+
| `stripe` | Boolean | false | 斑马纹 | `true` |
|
|
1815
|
+
| `border` | Boolean | false | 纵向边框 | `true` |
|
|
1816
|
+
| `fit` | Boolean | true | 列宽自撑 | `true` |
|
|
1817
|
+
| `show-header` | Boolean | true | 显示表头 | `true` |
|
|
1818
|
+
| `highlight-current-row` | Boolean | false | 高亮当前行 | `true` |
|
|
1819
|
+
| `row-key` | String/Function | - | 行数据key | `"id"` |
|
|
1820
|
+
| `width` | Number | - | 宽度(虚拟表格) | `800` |
|
|
1821
|
+
| `columns` | Array | [] | 列配置(虚拟表格) | `[]` |
|
|
1822
|
+
| `current-page` | Number | 1 | 当前页码 | `1` |
|
|
1823
|
+
| `page-size` | Number | 10 | 每页条数 | `10` |
|
|
1824
|
+
| `total` | Number | 0 | 总条数 | `100` |
|
|
1825
|
+
| `page-sizes` | Array | [10,20,30,40] | 每页条数选项 | `[10, 20, 50]` |
|
|
1826
|
+
| `layout` | String | prev, pager, next | 布局 | `"prev, pager, next, sizes, total"` |
|
|
1827
|
+
| `background` | Boolean | false | 背景色 | `true` |
|
|
1828
|
+
| **扩展属性** | | | | |
|
|
1829
|
+
| `isVirtualized` | String | '0' | 虚拟化表格 | `"1"` |
|
|
1830
|
+
| `pageable` | String | '0' | 开启分页 | `"1"` |
|
|
1831
|
+
| `frontPageFlag` | String | '0' | 前端分页 | `"1"` |
|
|
1832
|
+
| `defaultPageablePageSize` | Number | 10 | 默认分页大小 | `10` |
|
|
1833
|
+
| `pageSize` | Number | 5 | 每页条数 | `10` |
|
|
1834
|
+
| `selectable` | String | '0' | 单选模式 | `"1"` |
|
|
1835
|
+
| `canSelect` | Boolean | - | 可选择(别名) | `true` |
|
|
1836
|
+
| `pageAlign` | String | right | 分页对齐 | `"left"`, `"center"`, `"right"` |
|
|
1837
|
+
| `totalMetaCodes` | Array | [] | 统计列编码 | `["amount"]` |
|
|
1838
|
+
| `showOverflowTooltip` | String | - | 超出显示tooltip | `"1"` |
|
|
1839
|
+
| `columnWidth` | Number/String | - | 列宽 | `150`, `"150px"` |
|
|
1840
|
+
|
|
1841
|
+
#### 表格列配置 (pmPageMetaList)
|
|
1842
|
+
|
|
1843
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1844
|
+
|--------|------|--------|------|----------|
|
|
1845
|
+
| `type` | String | - | 列类型 | `"selection"`, `"index"` |
|
|
1846
|
+
| `width` | Number/String | - | 列宽 | `200`, `"200px"` |
|
|
1847
|
+
| `columnWidth` | Number/String | - | 列宽(优先) | `150` |
|
|
1848
|
+
| `minWidth` | Number | 160 | 最小列宽 | `120` |
|
|
1849
|
+
| `fixed` | String | - | 固定列 | `"left"`, `"right"` |
|
|
1850
|
+
| `sortable` | Boolean/String | false | 可排序 | `true` 或 `"1"` |
|
|
1851
|
+
| `align` | String | left | 对齐 | `"left"`, `"center"`, `"right"` |
|
|
1852
|
+
| `labelHidden` | String | '1' | 隐藏标签(表格列) | `"1"` |
|
|
1853
|
+
| `headerRender` | Function | - | 自定义表头渲染 | 函数 |
|
|
1854
|
+
|
|
1855
|
+
#### 统计行配置
|
|
1856
|
+
|
|
1857
|
+
```javascript
|
|
1858
|
+
totalMetaCodes: [
|
|
1859
|
+
'amount', // 简单统计(求和)
|
|
1860
|
+
{
|
|
1861
|
+
code: 'quantity',
|
|
1862
|
+
totalFn: (total, val, row) => {
|
|
1863
|
+
// 自定义统计函数
|
|
1864
|
+
return total + val
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
]
|
|
1868
|
+
```
|
|
1869
|
+
|
|
1870
|
+
#### 配置示例
|
|
1871
|
+
|
|
1872
|
+
**基础表格**
|
|
1873
|
+
```json
|
|
1874
|
+
{
|
|
1875
|
+
"metaCode": "data_table",
|
|
1876
|
+
"metaType": "table",
|
|
1877
|
+
"pageable": "1",
|
|
1878
|
+
"pageSize": 10,
|
|
1879
|
+
"pageAlign": "right",
|
|
1880
|
+
"selectable": "0",
|
|
1881
|
+
"totalMetaCodes": ["amount", "quantity"],
|
|
1882
|
+
"pmPageMetaList": [
|
|
1883
|
+
{
|
|
1884
|
+
"metaCode": "name",
|
|
1885
|
+
"metaType": "input",
|
|
1886
|
+
"labelZh": "名称",
|
|
1887
|
+
"width": 200
|
|
1888
|
+
},
|
|
1889
|
+
{
|
|
1890
|
+
"metaCode": "amount",
|
|
1891
|
+
"metaType": "input",
|
|
1892
|
+
"labelZh": "金额",
|
|
1893
|
+
"columnWidth": 150,
|
|
1894
|
+
"showMoney": "1"
|
|
1895
|
+
},
|
|
1896
|
+
{
|
|
1897
|
+
"metaCode": "status",
|
|
1898
|
+
"metaType": "select",
|
|
1899
|
+
"labelZh": "状态",
|
|
1900
|
+
"selectKey": "status_options",
|
|
1901
|
+
"width": 120
|
|
1902
|
+
}
|
|
1903
|
+
]
|
|
1904
|
+
}
|
|
1905
|
+
```
|
|
1906
|
+
|
|
1907
|
+
**虚拟化表格**
|
|
1908
|
+
```json
|
|
1909
|
+
{
|
|
1910
|
+
"metaCode": "virtual_table",
|
|
1911
|
+
"metaType": "table",
|
|
1912
|
+
"isVirtualized": "1",
|
|
1913
|
+
"height": 400,
|
|
1914
|
+
"pmPageMetaList": []
|
|
1915
|
+
}
|
|
1916
|
+
```
|
|
1917
|
+
|
|
1918
|
+
---
|
|
1919
|
+
|
|
1920
|
+
### ElPagination - 分页
|
|
1921
|
+
|
|
1922
|
+
**metaType**: `pagination`
|
|
1923
|
+
|
|
1924
|
+
#### 可配置属性
|
|
1925
|
+
|
|
1926
|
+
| 属性名 | 类型 | 默认值 | 说明 | 配置示例 |
|
|
1927
|
+
|--------|------|--------|------|----------|
|
|
1928
|
+
| `current-page` | Number | 1 | 当前页码 | `1` |
|
|
1929
|
+
| `page-size` | Number | 10 | 每页条数 | `10` |
|
|
1930
|
+
| `total` | Number | 0 | 总条数 | `100` |
|
|
1931
|
+
| `page-sizes` | Array | [10,20,30,40] | 每页条数选项 | `[5, 10, 20, 40]` |
|
|
1932
|
+
| `layout` | String | prev, pager, next... | 布局 | `"prev, pager, next, sizes, total"` |
|
|
1933
|
+
| `background` | Boolean | false | 背景色 | `true` |
|
|
1934
|
+
| `small` | Boolean | false | 小型分页 | `true` |
|
|
1935
|
+
| `disabled` | Boolean | false | 禁用 | `true` |
|
|
1936
|
+
| `pager-count` | Number | 7 | 页码按钮数量 | `5` |
|
|
1937
|
+
|
|
1938
|
+
#### 配置示例
|
|
1939
|
+
|
|
1940
|
+
```json
|
|
1941
|
+
{
|
|
1942
|
+
"metaCode": "pagination",
|
|
1943
|
+
"metaType": "pagination",
|
|
1944
|
+
"page-sizes": [5, 10, 20, 40],
|
|
1945
|
+
"layout": "prev, pager, next, jumper, sizes, total",
|
|
1946
|
+
"background": true
|
|
1947
|
+
}
|
|
1948
|
+
```
|
|
1949
|
+
|
|
1950
|
+
---
|
|
1951
|
+
|
|
1952
|
+
## 附录
|
|
1953
|
+
|
|
1954
|
+
### 渲染器封装层次说明
|
|
1955
|
+
|
|
1956
|
+
渲染器采用了三层封装架构,用户使用的是最外层的组件:
|
|
1957
|
+
|
|
1958
|
+
```
|
|
1959
|
+
用户使用的组件
|
|
1960
|
+
↓
|
|
1961
|
+
resolver-web.vue (PC端) / resolver-H5.vue (H5端)
|
|
1962
|
+
↓
|
|
1963
|
+
resolver-common.vue (公共逻辑)
|
|
1964
|
+
↓
|
|
1965
|
+
index.jsx (内部实现)
|
|
1966
|
+
```
|
|
1967
|
+
|
|
1968
|
+
**各层职责:**
|
|
1969
|
+
|
|
1970
|
+
| 层级 | 文件 | 职责 |
|
|
1971
|
+
|------|------|------|
|
|
1972
|
+
| **外层** | `resolver-web.vue` | PC端入口,提供Element Plus默认实例 |
|
|
1973
|
+
| **外层** | `resolver-H5.vue` | H5端入口,提供移动端默认实例 |
|
|
1974
|
+
| **中间层** | `resolver-common.vue` | 公共逻辑:配置加载、枚举合并、请求拦截 |
|
|
1975
|
+
| **内层** | `index.jsx` | 核心渲染逻辑:组件渲染、规则引擎、表单校验 |
|
|
1976
|
+
|
|
1977
|
+
**属性传递机制:**
|
|
1978
|
+
|
|
1979
|
+
1. **显式定义属性**: 在 `resolver-common.vue`、`resolver-web.vue`、`resolver-H5.vue` 的 `defineProps` 中明确定义的属性,带有类型检查和默认值
|
|
1980
|
+
2. **透传属性**: 通过 `v-bind="attrs"` 将未显式定义的属性直接传递给下一层,最终传递给 `index.jsx`
|
|
1981
|
+
|
|
1982
|
+
```vue
|
|
1983
|
+
<!-- resolver-web.vue / resolver-H5.vue -->
|
|
1984
|
+
<Resolver
|
|
1985
|
+
ref="resolverRef"
|
|
1986
|
+
v-bind="attrs" <!-- 透传所有未显式定义的属性 -->
|
|
1987
|
+
:getNativeComps="getNativeComps"
|
|
1988
|
+
:messageInstance="props.messageInstance"
|
|
1989
|
+
...
|
|
1990
|
+
/>
|
|
1991
|
+
|
|
1992
|
+
<!-- resolver-common.vue -->
|
|
1993
|
+
<Resolver
|
|
1994
|
+
v-if="pageConfig && selectsLoad"
|
|
1995
|
+
ref="resolverRef"
|
|
1996
|
+
v-bind="attrs" <!-- 继续透传 -->
|
|
1997
|
+
:isH5="props.isH5"
|
|
1998
|
+
:lang="props.lang"
|
|
1999
|
+
:config="pageConfig || null" <!-- 唯一被覆盖的属性 -->
|
|
2000
|
+
...
|
|
2001
|
+
/>
|
|
2002
|
+
```
|
|
2003
|
+
|
|
2004
|
+
**属性使用建议:**
|
|
2005
|
+
|
|
2006
|
+
- ✅ **推荐**: 使用显式定义的属性(有类型检查和默认值)
|
|
2007
|
+
- ✅ **可用**: `index.jsx` 中定义的所有其他属性都通过 attrs 透传可用
|
|
2008
|
+
- ⚠️ **注意**: 仅有 `config` 属性被中间层覆盖,其他属性均可直接使用
|
|
2009
|
+
|
|
2010
|
+
**被中间层覆盖的属性(仅1个):**
|
|
2011
|
+
|
|
2012
|
+
| 属性 | 说明 |
|
|
2013
|
+
|------|------|
|
|
2014
|
+
| `config` | 被 `resolver-common.vue` 覆盖,使用内部加载的 `pageConfig` 或外部传入的 `nativeConfig`。如需手动传入配置,请使用 `nativeConfig` 属性 |
|
|
2015
|
+
|
|
2016
|
+
**未被覆盖的 index.jsx 属性(全部可用):**
|
|
2017
|
+
|
|
2018
|
+
`index.jsx` 中定义的其他所有属性都通过 `v-bind="attrs"` 透传,用户可以直接使用,包括但不限于:
|
|
2019
|
+
|
|
2020
|
+
- `mode` - 渲染模式 (operate/detail/log)
|
|
2021
|
+
- `components` - 自定义组件注册
|
|
2022
|
+
- `selects` - 下拉选项数据(会被中间层合并处理,但仍可使用)
|
|
2023
|
+
- `dataLoad` - 规则初始化控制
|
|
2024
|
+
- `loadEventsBefore` / `loadEventsAfter` - 加载事件钩子
|
|
2025
|
+
- `axiosInstance` / `dayjsInstance` - 实例对象(中间层已提供默认值,但可覆盖)
|
|
2026
|
+
- `messageCb` - 提示语回调
|
|
2027
|
+
- 以及其他所有在 `index.jsx` props 中定义的属性
|
|
2028
|
+
|
|
2029
|
+
### 配置平台集成说明
|
|
2030
|
+
|
|
2031
|
+
#### busiIdentityId - 配置平台页面标识
|
|
2032
|
+
|
|
2033
|
+
`busiIdentityId` 是渲染器与配置平台集成的关键属性,用于标识配置平台中的页面。
|
|
2034
|
+
|
|
2035
|
+
**工作流程:**
|
|
2036
|
+
|
|
2037
|
+
```
|
|
2038
|
+
1. 用户传入 busiIdentityId
|
|
2039
|
+
↓
|
|
2040
|
+
2. 渲染器内部自动调用配置平台接口
|
|
2041
|
+
↓
|
|
2042
|
+
3. 获取页面配置和枚举数据
|
|
2043
|
+
↓
|
|
2044
|
+
4. 自动渲染页面
|
|
2045
|
+
```
|
|
2046
|
+
|
|
2047
|
+
**使用步骤:**
|
|
2048
|
+
|
|
2049
|
+
1. **在配置平台创建页面**,获取页面标识 `busiIdentityId`
|
|
2050
|
+
2. **在代码中传入** `busiIdentityId` 属性
|
|
2051
|
+
3. **渲染器自动加载**配置并渲染页面,无需手动调用接口
|
|
2052
|
+
|
|
2053
|
+
**完整示例:**
|
|
2054
|
+
|
|
2055
|
+
```vue
|
|
2056
|
+
<template>
|
|
2057
|
+
<Resolver
|
|
2058
|
+
ref="resolverRef"
|
|
2059
|
+
:busiIdentityId="'PAGE_USER_MANAGEMENT_001'"
|
|
2060
|
+
v-model="formData"
|
|
2061
|
+
:selects="selects"
|
|
2062
|
+
:lang="lang"
|
|
2063
|
+
:loadingInstance="loadingInstance"
|
|
2064
|
+
:messageInstance="ElMessage"
|
|
2065
|
+
@on-loaded-config-competed="handleConfigLoaded"
|
|
2066
|
+
@on-loaded-selects-competed="handleSelectsLoaded"
|
|
2067
|
+
/>
|
|
2068
|
+
</template>
|
|
2069
|
+
|
|
2070
|
+
<script setup>
|
|
2071
|
+
import { ref } from 'vue'
|
|
2072
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
2073
|
+
import { ElMessage, ElLoading } from 'element-plus'
|
|
2074
|
+
|
|
2075
|
+
const resolverRef = ref(null)
|
|
2076
|
+
const formData = ref({})
|
|
2077
|
+
const lang = ref('zh')
|
|
2078
|
+
const selects = ref({})
|
|
2079
|
+
|
|
2080
|
+
// 配置加载完成回调
|
|
2081
|
+
const handleConfigLoaded = (config) => {
|
|
2082
|
+
console.log('✅ 页面配置加载成功', config)
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
// 枚举加载完成回调
|
|
2086
|
+
const handleSelectsLoaded = (selectsData) => {
|
|
2087
|
+
console.log('✅ 枚举数据加载成功', selectsData)
|
|
2088
|
+
}
|
|
2089
|
+
</script>
|
|
2090
|
+
```
|
|
2091
|
+
|
|
2092
|
+
**配置平台返回的数据结构:**
|
|
2093
|
+
|
|
2094
|
+
```json
|
|
2095
|
+
{
|
|
2096
|
+
"pageConfig": {
|
|
2097
|
+
"metaType": "CustomComponentFormLayout",
|
|
2098
|
+
"pmPageMetaList": [
|
|
2099
|
+
{
|
|
2100
|
+
"metaCode": "username",
|
|
2101
|
+
"metaType": "input",
|
|
2102
|
+
"labelZh": "用户名",
|
|
2103
|
+
"requiredFlag": "1"
|
|
2104
|
+
}
|
|
2105
|
+
]
|
|
2106
|
+
},
|
|
2107
|
+
"selects": {
|
|
2108
|
+
"status_options": [
|
|
2109
|
+
{ "columnValue": "1", "columnDesc_zh": "启用" },
|
|
2110
|
+
{ "columnValue": "0", "columnDesc_zh": "禁用" }
|
|
2111
|
+
]
|
|
2112
|
+
}
|
|
2113
|
+
}
|
|
2114
|
+
```
|
|
2115
|
+
|
|
2116
|
+
**高级用法 - 使用 nativeConfig 手动传入配置:**
|
|
2117
|
+
|
|
2118
|
+
```vue
|
|
2119
|
+
<template>
|
|
2120
|
+
<Resolver
|
|
2121
|
+
:nativeConfig="customConfig"
|
|
2122
|
+
v-model="formData"
|
|
2123
|
+
/>
|
|
2124
|
+
</template>
|
|
2125
|
+
|
|
2126
|
+
<script setup>
|
|
2127
|
+
import { ref } from 'vue'
|
|
2128
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
2129
|
+
|
|
2130
|
+
const formData = ref({})
|
|
2131
|
+
|
|
2132
|
+
// 手动传入配置,渲染器不会自动加载
|
|
2133
|
+
const customConfig = ref({
|
|
2134
|
+
pmPageMetaList: [
|
|
2135
|
+
{
|
|
2136
|
+
metaCode: 'username',
|
|
2137
|
+
metaType: 'input',
|
|
2138
|
+
labelZh: '用户名',
|
|
2139
|
+
requiredFlag: '1'
|
|
2140
|
+
}
|
|
2141
|
+
]
|
|
2142
|
+
})
|
|
2143
|
+
</script>
|
|
2144
|
+
```
|
|
2145
|
+
|
|
2146
|
+
**高级用法 - 额外请求参数:**
|
|
2147
|
+
|
|
2148
|
+
```vue
|
|
2149
|
+
<template>
|
|
2150
|
+
<Resolver
|
|
2151
|
+
:busiIdentityId="'PAGE_001'"
|
|
2152
|
+
:loadConfigReq="{ version: '1.0' }"
|
|
2153
|
+
:builtPolyfillReq="{ token: 'xxx' }"
|
|
2154
|
+
v-model="formData"
|
|
2155
|
+
/>
|
|
2156
|
+
</template>
|
|
2157
|
+
|
|
2158
|
+
<script setup>
|
|
2159
|
+
import { ref } from 'vue'
|
|
2160
|
+
import Resolver from 'resolver-egretimp-plus/web'
|
|
2161
|
+
|
|
2162
|
+
const formData = ref({})
|
|
2163
|
+
</script>
|
|
2164
|
+
```
|
|
2165
|
+
|
|
2166
|
+
**优势:**
|
|
2167
|
+
- ✅ 页面配置与代码解耦,可在配置平台可视化编辑
|
|
2168
|
+
- ✅ 修改配置无需重新部署代码
|
|
2169
|
+
- ✅ 支持动态加载枚举数据
|
|
2170
|
+
- ✅ 内置缓存机制,提升加载性能
|
|
2171
|
+
- ✅ 自动处理请求参数和响应数据
|
|
2172
|
+
|
|
2173
|
+
### 组件类型完整映射表
|
|
2174
|
+
|
|
2175
|
+
| metaType | 渲染组件 | 说明 |
|
|
2176
|
+
|----------|----------|------|
|
|
2177
|
+
| `input` | ElInput | 文本输入框 |
|
|
2178
|
+
| `textarea` | ElInput | 多行文本 |
|
|
2179
|
+
| `select` | ElSelect | 下拉选择 |
|
|
2180
|
+
| `radio` | ElRadio | 单选框 |
|
|
2181
|
+
| `checkbox` | ElCheckbox | 复选框 |
|
|
2182
|
+
| `date` | ElDatePicker | 日期选择 |
|
|
2183
|
+
| `date-range` | ElDatePicker | 日期范围 |
|
|
2184
|
+
| `time` | ElTimePicker | 时间选择 |
|
|
2185
|
+
| `time-range` | ElTimePicker | 时间范围 |
|
|
2186
|
+
| `number` | ElInputNumber | 数字输入 |
|
|
2187
|
+
| `button` | ElButton | 按钮 |
|
|
2188
|
+
| `static-text` | ElText | 静态文本 |
|
|
2189
|
+
| `table` | CustomComponentTable | 表格 |
|
|
2190
|
+
| `checkbox-table` | CustomComponentTable | 可选择表格 |
|
|
2191
|
+
| `tab` | CustomComponentTabs | 标签页 |
|
|
2192
|
+
| `tab-pane` | CustomComponentTabPane | 标签页面板 |
|
|
2193
|
+
| `collapse` | CustomComponentCollapse | 折叠面板 |
|
|
2194
|
+
| `card` | CustomComponentCollapse | 卡片 |
|
|
2195
|
+
| `cycle` | CustomComponentCycle | 循环列表 |
|
|
2196
|
+
| `tree` | CustomComponentTree | 树形控件 |
|
|
2197
|
+
| `pagination` | ElPagination | 分页 |
|
|
2198
|
+
| `steps` | CustomComponentSteps | 步骤条 |
|
|
2199
|
+
| `select-employees` | CustomComponentSelectEmployees | 员工选择器 |
|
|
2200
|
+
| `rich-editor` | CustomComponentEditor | 富文本编辑器 |
|
|
2201
|
+
| `mail-send` | CustomComponentSendMail | 邮件发送 |
|
|
2202
|
+
| `file-import` | CustomComponentFileImport | 文件导入 |
|
|
2203
|
+
| `file-export` | CustomComponentFileExport | 文件导出 |
|
|
2204
|
+
| `CustomComponentFormLayout` | CustomComponentFormLayout | 表单布局 |
|
|
2205
|
+
| `CustomComponentDialog` | CustomComponentDialog | 对话框 |
|
|
2206
|
+
| `CustomComponentRow` | CustomComponentRow | 行布局 |
|
|
2207
|
+
| `CustomComponentCol` | CustomComponentCol | 列布局 |
|
|
2208
|
+
| `CustomComponentCycleTabPane` | CustomComponentCycleTabPane | 循环标签页 |
|
|
2209
|
+
| `CustomComponentInputDialog` | CustomComponentInputDialog | 输入对话框 |
|
|
2210
|
+
| `CustomComponentPlain` | CustomComponentPlain | 纯文本(表格列) |
|
|
2211
|
+
| `CustomComponentSelectEmployees` | CustomComponentSelectEmployees | 员工选择器 |
|
|
2212
|
+
| `CustomComponentEditor` | CustomComponentEditor | 富文本编辑器 |
|
|
2213
|
+
| `CustomComponentSendMail` | CustomComponentSendMail | 邮件发送 |
|
|
2214
|
+
| `CustomComponentFileImport` | CustomComponentFileImport | 文件导入 |
|
|
2215
|
+
| `CustomComponentFileExport` | CustomComponentFileExport | 文件导出 |
|
|
2216
|
+
| `CustomComponentTree` | CustomComponentTree | 树形控件 |
|
|
2217
|
+
| `CustomComponentSteps` | CustomComponentSteps | 步骤条 |
|
|
2218
|
+
|
|
2219
|
+
### 配置属性命名规则
|
|
2220
|
+
|
|
2221
|
+
1. **布尔值属性**: 使用 `'1'`/`'0'` 字符串或 `true`/`false` 布尔值
|
|
2222
|
+
2. **数字属性**: 可使用字符串,组件内部会自动转换
|
|
2223
|
+
3. **样式属性**: `defStyle` 为 JSON 字符串,需序列化
|
|
2224
|
+
4. **扩展属性**: `extendAttr` 为 JSON 字符串,可包含函数(字符串形式)
|
|
2225
|
+
5. **事件属性**: 以 `on` 开头的属性会被识别为事件处理器
|
|
2226
|
+
6. **国际化属性**: 中文用 `Zh` 后缀,英文用 `En` 后缀
|
|
2227
|
+
|
|
2228
|
+
### 特殊说明
|
|
2229
|
+
|
|
2230
|
+
1. **表格列配置**: 表格列自动设置 `labelHidden='1'`, `isColumn=true`
|
|
2231
|
+
2. **循环组件**: 根据数据动态生成 `multiPmPageMetaList`
|
|
2232
|
+
3. **规则引擎**: `hireRelat` 存储组件关联路径,用于规则匹配
|
|
2233
|
+
4. **动态映射**: `dynamicMapComp` 存储 `dynamicHireRelat` 到配置的映射
|
|
2234
|
+
5. **表单校验**: `requiredFlag='1'` 自动生成必填校验规则
|
|
2235
|
+
6. **禁用计算**: 根据 `mode` 和 `editFlag` 自动计算 `disabled`
|
|
2236
|
+
7. **隐藏计算**: `hidden='1'` 或 `collapseHidden='1'` 隐藏组件
|
|
2237
|
+
|
|
2238
|
+
---
|
|
2239
|
+
|
|
2240
|
+
**文档版本**: 1.0
|
|
2241
|
+
**更新日期**: 2024-01-15
|
|
2242
|
+
**适用版本**: resolver-egretimp-plus v0.1.140
|