vue2-client 1.20.19 → 1.20.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/.claude/settings.local.json +30 -30
  2. package/.eslintrc.js +74 -74
  3. package/Components.md +60 -60
  4. package/index.js +31 -31
  5. package/jest-transform-stub.js +8 -8
  6. package/jest.setup.js +7 -7
  7. package/package.json +1 -1
  8. package/src/assets/img/querySlotDemo.svg +15 -15
  9. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  10. package/src/base-client/components/common/CitySelect/index.js +3 -3
  11. package/src/base-client/components/common/CitySelect/index.md +109 -109
  12. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  13. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  14. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  15. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  16. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  17. package/src/base-client/components/common/Tree/index.js +2 -2
  18. package/src/base-client/components/common/Upload/index.js +3 -3
  19. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  20. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  21. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  22. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  23. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  24. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +671 -671
  25. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  26. package/src/base-client/components/common/XDescriptions/index.md +382 -382
  27. package/src/base-client/components/common/XForm/index.md +178 -178
  28. package/src/base-client/components/common/XFormTable/XFormTable.vue +8 -0
  29. package/src/base-client/components/common/XFormTable/demo.vue +79 -37
  30. package/src/base-client/components/common/XInspectionDetailDrawer/components/CheckItems.vue +42 -17
  31. package/src/base-client/components/common/XInspectionDetailDrawer/components/HazardPhotos.vue +48 -19
  32. package/src/base-client/components/common/XInspectionDetailDrawer/services/inspectionService.js +5 -3
  33. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  34. package/src/base-client/components/common/XStepView/index.js +3 -3
  35. package/src/base-client/components/common/XStepView/index.md +31 -31
  36. package/src/base-client/components/common/XTable/XTable.vue +20 -0
  37. package/src/base-client/components/common/XTable/index.md +255 -255
  38. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  39. package/src/base-client/plugins/Config.js +19 -19
  40. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  41. package/src/components/Charts/Bar.vue +62 -62
  42. package/src/components/Charts/ChartCard.vue +134 -134
  43. package/src/components/Charts/Liquid.vue +67 -67
  44. package/src/components/Charts/MiniArea.vue +39 -39
  45. package/src/components/Charts/MiniBar.vue +39 -39
  46. package/src/components/Charts/MiniProgress.vue +75 -75
  47. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  48. package/src/components/Charts/Radar.vue +68 -68
  49. package/src/components/Charts/RankList.vue +77 -77
  50. package/src/components/Charts/TagCloud.vue +113 -113
  51. package/src/components/Charts/TransferBar.vue +64 -64
  52. package/src/components/Charts/Trend.vue +82 -82
  53. package/src/components/Charts/chart.less +12 -12
  54. package/src/components/Charts/smooth.area.less +13 -13
  55. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  56. package/src/components/NumberInfo/index.js +3 -3
  57. package/src/components/NumberInfo/index.less +54 -54
  58. package/src/components/NumberInfo/index.md +43 -43
  59. package/src/components/card/ChartCard.vue +79 -79
  60. package/src/components/chart/Bar.vue +60 -60
  61. package/src/components/chart/MiniArea.vue +67 -67
  62. package/src/components/chart/MiniBar.vue +59 -59
  63. package/src/components/chart/MiniProgress.vue +57 -57
  64. package/src/components/chart/Radar.vue +80 -80
  65. package/src/components/chart/RankingList.vue +60 -60
  66. package/src/components/chart/Trend.vue +79 -79
  67. package/src/components/chart/index.less +9 -9
  68. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  69. package/src/components/input/IInput.vue +66 -66
  70. package/src/components/menu/SideMenu.vue +75 -75
  71. package/src/components/menu/menu.js +273 -273
  72. package/src/components/tool/AStepItem.vue +60 -60
  73. package/src/layouts/CommonLayout.vue +56 -56
  74. package/src/lib.js +1 -1
  75. package/src/mock/extend/index.js +84 -84
  76. package/src/mock/goods/index.js +108 -108
  77. package/src/pages/WorkflowDetail/WorkFlowDemo4.vue +127 -0
  78. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +417 -417
  79. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  80. package/src/pages/system/dictionary/index.vue +44 -44
  81. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  82. package/src/pages/system/monitor/operLog/index.vue +37 -37
  83. package/src/services/api/cas.js +79 -79
  84. package/src/store/modules/setting.js +119 -119
  85. package/src/utils/errorCode.js +6 -6
  86. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,382 +1,382 @@
1
- # XDescriptionsGroup
2
-
3
- 动态Descriptions分组控件,根据JSON配置动态生成Descriptions,支持多种字段函数控制显示、样式和格式化。
4
-
5
- ## 何时使用
6
-
7
- 当需要一个动态生成的、支持条件显示、自定义样式和数据格式化的Descriptions时
8
-
9
- ## 引用方式
10
-
11
- ```javascript
12
- import XDescriptionsGroup from '@vue2-client/base-client/components/common/XDescriptions/XDescriptionsGroup'
13
-
14
- export default {
15
- components: {
16
- XDescriptionsGroup
17
- }
18
- }
19
- ```
20
-
21
- ## API
22
-
23
- | 参数 | 说明 | 类型 | 默认值 |
24
- |-----------------|-------------|--------|------|
25
- | data | 业务数据 | Object | {} |
26
- | configName | 配置文件名 | String | '' |
27
- | serviceName | 配置所属命名空间 | String | process.env.VUE_APP_SYSTEM_NAME |
28
-
29
- ## 配置格式
30
-
31
- ### 配置结构
32
-
33
- ```javascript
34
- [
35
- {
36
- "name": "分组名称",
37
- "type": "normal", // 分组类型:normal/array/slot(可选,默认normal)
38
- "key": "dataKey", // 数据key(数组类型时必需)
39
- "fields": [
40
- {
41
- "key": "字段key",
42
- "name": "字段显示名称",
43
- "span": 2, // 列宽(可选,默认1)
44
- "showIf": "(data, field) => ...", // 条件显示函数(可选)
45
- "styleFunc": "(value, data, field) => ...", // 样式函数(可选)
46
- "formatFunc": "(value, data, field) => ...", // 格式化函数(可选)
47
- "requireFunc": "(data, field) => ..." // 必填标记函数(可选)
48
- }
49
- ]
50
- }
51
- ]
52
- ```
53
-
54
- ### 全局配置说明
55
-
56
- #### column - 列数控制
57
-
58
- - **作用**: 控制每行显示的列数
59
- - **类型**: `Number`
60
- - **默认值**: `3`
61
- - **示例**: `"column": 2` 表示每行显示 2 列
62
-
63
- #### getRealData - 数据处理方式
64
-
65
- - **作用**: 是否使用 `getRealKeyData` 方法处理数据
66
- - **类型**: `Boolean`
67
- - **默认值**: `false`
68
- - **示例**: `"getRealData": true` 启用数据处理
69
-
70
- #### tabMode - 显示模式
71
-
72
- - **作用**: 控制组件的显示模式
73
- - **类型**: `String`
74
- - **可选值**: `'left' | 'top' | 'none'`
75
- - **默认值**: `'left'`
76
- - **示例**: `"tabMode": "top"` 使用顶部横向导航
77
-
78
- ### 分组类型说明
79
-
80
- #### normal - 普通分组(默认)
81
-
82
- ```javascript
83
- [
84
- {
85
- "name": "基本信息",
86
- "type": "normal",
87
- "fields": [
88
- {
89
- "key": "f_name",
90
- "name": "设备名称"
91
- }
92
- ]
93
- }
94
- ]
95
- ```
96
-
97
- #### array - 数组分组
98
-
99
- 用于处理数组类型数据,会为每个数组项生成一个子描述:
100
-
101
- ```javascript
102
- [
103
- {
104
- "name": "设备列表",
105
- "type": "array",
106
- "key": "devices",
107
- "fields": [
108
- {
109
- "key": "f_name",
110
- "name": "设备名称"
111
- },
112
- {
113
- "key": "f_status",
114
- "name": "设备状态"
115
- }
116
- ]
117
- }
118
- ]
119
- ```
120
-
121
- #### slot - 插槽分组
122
-
123
- 用于将某个分组交给父组件通过**具名插槽**自定义渲染,适用于配置无法覆盖的展示或交互。
124
-
125
- **配置说明:**
126
-
127
- - **name**:分组标题(left/top 模式下作为 Tab 文案,none 模式下可选展示)
128
- - **type**:`"slot"`,表示该分组为插槽分组
129
- - **slotName**:字符串,与父组件具名插槽名一致;省略时使用 `name` 作为插槽名
130
-
131
- **数组格式配置示例:**
132
-
133
- ```javascript
134
- [
135
- {
136
- "name": "自定义区块",
137
- "type": "slot",
138
- "slotName": "customSection"
139
- }
140
- ]
141
- ```
142
-
143
- **对象格式配置示例:**
144
-
145
- ```javascript
146
- {
147
- "自定义区块": {
148
- "type": "slot",
149
- "slotName": "customSection"
150
- }
151
- }
152
- ```
153
-
154
- **父组件用法:**
155
-
156
- 通过具名插槽传入内容,插槽名与配置中的 `slotName` 一致。组件会向插槽注入当前详情 `data`,可使用作用域插槽接收:
157
-
158
- ```html
159
- <XDescriptionsGroup :data="detail" config-name="xxx">
160
- <template #customSection="{ data }">
161
- <div>自定义内容,可访问当前详情 data:{{ data }}</div>
162
- </template>
163
- </XDescriptionsGroup>
164
- ```
165
-
166
- 若不需要使用 `data`,也可使用默认插槽写法:
167
-
168
- ```html
169
- <XDescriptionsGroup :data="detail" config-name="xxx">
170
- <template #customSection>自定义静态内容</template>
171
- </XDescriptionsGroup>
172
- ```
173
-
174
- ### 字段属性说明
175
-
176
- #### span - 列宽控制
177
-
178
- - **作用**: 控制字段占用的列数
179
- - **类型**: `Number`
180
- - **默认值**: `1`
181
- - **示例**: `"span": 2` 表示该字段占用 2 列宽度
182
-
183
- ### 字段函数说明
184
-
185
- #### 1. showIf - 条件显示函数
186
-
187
- - **作用**: 控制字段是否显示
188
- - **参数**: `(data, field)`
189
- - **返回值**: `boolean`
190
- - **示例**: `"showIf": "(data, field) => data.amount > 1000"`
191
-
192
- #### 2. styleFunc - 样式函数
193
-
194
- - **作用**: 设置字段内容的样式
195
- - **参数**: `(value, data, field)`
196
- - **返回值**: `Object` 样式对象,如 `{color: 'red'}`
197
- - **示例**: `"styleFunc": "(value, data, field) => ({ color: value > 0 ? 'green' : 'red' })"`
198
-
199
- #### 3. formatFunc - 格式化函数
200
-
201
- - **作用**: 自定义字段值的显示格式
202
- - **参数**: `(value, data, field)`
203
- - **返回值**: `String` 格式化后的字符串
204
- - **示例**: `"formatFunc": "(value, data, field) => '¥' + value.toLocaleString()"`
205
-
206
- #### 4. requireFunc - 必填标记函数
207
-
208
- - **作用**: 在字段标题后显示红色星号
209
- - **参数**: `(data, field)`
210
- - **返回值**: `boolean`
211
- - **示例**: `"requireFunc": "(data, field) => data.type === 'important'"`
212
-
213
- #### 4. canEdit - 是否可进行修改
214
-
215
- - **作用**: 如果canEdit配置为true,则渲染铅笔修改图标,由外部组件实现具体编辑逻辑
216
- - **参数**: `(field, value, data)`
217
- - **示例**: `"canEdit": true`
218
-
219
- ## 完整配置示例
220
-
221
- ### 普通分组配置示例
222
-
223
- ```javascript
224
- // 配置文件:deviceInfo.json
225
- [
226
- {
227
- "name": "基本信息",
228
- "fields": [
229
- {
230
- "key": "f_name",
231
- "name": "设备名称",
232
- "span": 2,
233
- "requireFunc": "true",
234
- "canEdit": true
235
- },
236
- {
237
- "key": "f_status",
238
- "name": "状态",
239
- "showIf": "(data, field) => data.f_status",
240
- "styleFunc": "(value, data, field) => ({ color: value === '正常' ? 'green' : 'red' })"
241
- }
242
- ]
243
- },
244
- {
245
- "name": "财务信息",
246
- "fields": [
247
- {
248
- "key": "f_amount",
249
- "name": "金额",
250
- "span": 2,
251
- "showIf": "(data, field) => data.f_amount > 0",
252
- "styleFunc": "(value, data, field) => ({ color: value > 5000 ? 'red' : 'green', fontWeight: 'bold' })",
253
- "formatFunc": "(value, data, field) => '¥' + Number(value).toLocaleString()",
254
- "requireFunc": "(data, field) => data.f_amount > 1000"
255
- },
256
- {
257
- "key": "f_phone",
258
- "name": "联系电话",
259
- "formatFunc": "(value, data, field) => value ? value.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2') : '--'"
260
- }
261
- ]
262
- }
263
- ]
264
- ```
265
-
266
- ### 数组分组配置示例
267
-
268
- ```javascript
269
- // 配置文件:deviceList.json
270
- [
271
- {
272
- "name": "设备列表",
273
- "type": "array",
274
- "key": "devices",
275
- "fields": [
276
- {
277
- "key": "f_name",
278
- "name": "设备名称",
279
- "styleFunc": "(value, data, field) => ({ fontWeight: 'bold' })"
280
- },
281
- {
282
- "key": "f_status",
283
- "name": "状态",
284
- "styleFunc": "(value, data, field) => ({ color: value === '在线' ? 'green' : 'gray' })"
285
- },
286
- {
287
- "key": "f_amount",
288
- "name": "金额",
289
- "formatFunc": "(value, data, field) => value ? '¥' + value : '--'"
290
- }
291
- ]
292
- }
293
- ]
294
- ```
295
-
296
- ## 使用示例
297
-
298
- ### 基础使用
299
-
300
- ```vue
301
- <template>
302
- <x-descriptions-group
303
- :data="deviceData"
304
- configName="deviceInfo">
305
- </x-descriptions-group>
306
- </template>
307
-
308
- <script>
309
- import XDescriptionsGroup from '@vue2-client/base-client/components/common/XDescriptions/XDescriptionsGroup'
310
-
311
- export default {
312
- components: {
313
- XDescriptionsGroup
314
- },
315
- data () {
316
- return {
317
- deviceData: {
318
- f_name: '智能水表001',
319
- f_status: '正常',
320
- f_amount: 15000,
321
- f_phone: '13812345678'
322
- }
323
- }
324
- }
325
- }
326
- </script>
327
- ```
328
-
329
- ### 高级用法 - 动态配置
330
-
331
- ```vue
332
- <template>
333
- <x-descriptions-group
334
- :data="formData"
335
- :configName="configName"
336
- serviceName="customService">
337
- </x-descriptions-group>
338
- </template>
339
-
340
- <script>
341
- export default {
342
- data () {
343
- return {
344
- configName: 'dynamicForm',
345
- formData: {
346
- // 根据业务需求动态构建数据
347
- }
348
- }
349
- },
350
- created() {
351
- // 根据用户权限动态选择配置
352
- this.configName = this.isAdmin ? 'adminForm' : 'userForm'
353
- }
354
- }
355
- </script>
356
- ```
357
-
358
- ## 注意事项
359
-
360
- 1. **函数格式**: 所有函数字符串必须使用箭头函数格式,如 `"(data, field) => data.amount > 1000"`
361
- 2. **错误处理**: 函数执行错误时会输出警告日志,不会影响组件正常渲染
362
- 3. **性能考虑**: 函数会在每次渲染时执行,避免在函数中编写耗时操作
363
- 4. **样式应用**: styleFunc 通过内联样式应用到字段内容上,优先级低于CSS类
364
- 5. **兼容性**: 保持向后兼容,不配置函数的字段按原样显示
365
-
366
- ## 支持的显示模式
367
-
368
- 组件支持三种 tab 显示模式,通过配置文件设置:
369
-
370
- - `left`: 左侧垂直导航(默认)
371
- - `top`: 顶部横向导航
372
- - `none`: 无导航,直接显示所有内容
373
-
374
- 配置示例:
375
-
376
- ```javascript
377
- {
378
- "tabMode": "top",
379
- "column": 2,
380
- "groups": [...]
381
- }
382
- ```
1
+ # XDescriptionsGroup
2
+
3
+ 动态Descriptions分组控件,根据JSON配置动态生成Descriptions,支持多种字段函数控制显示、样式和格式化。
4
+
5
+ ## 何时使用
6
+
7
+ 当需要一个动态生成的、支持条件显示、自定义样式和数据格式化的Descriptions时
8
+
9
+ ## 引用方式
10
+
11
+ ```javascript
12
+ import XDescriptionsGroup from '@vue2-client/base-client/components/common/XDescriptions/XDescriptionsGroup'
13
+
14
+ export default {
15
+ components: {
16
+ XDescriptionsGroup
17
+ }
18
+ }
19
+ ```
20
+
21
+ ## API
22
+
23
+ | 参数 | 说明 | 类型 | 默认值 |
24
+ |-----------------|-------------|--------|------|
25
+ | data | 业务数据 | Object | {} |
26
+ | configName | 配置文件名 | String | '' |
27
+ | serviceName | 配置所属命名空间 | String | process.env.VUE_APP_SYSTEM_NAME |
28
+
29
+ ## 配置格式
30
+
31
+ ### 配置结构
32
+
33
+ ```javascript
34
+ [
35
+ {
36
+ "name": "分组名称",
37
+ "type": "normal", // 分组类型:normal/array/slot(可选,默认normal)
38
+ "key": "dataKey", // 数据key(数组类型时必需)
39
+ "fields": [
40
+ {
41
+ "key": "字段key",
42
+ "name": "字段显示名称",
43
+ "span": 2, // 列宽(可选,默认1)
44
+ "showIf": "(data, field) => ...", // 条件显示函数(可选)
45
+ "styleFunc": "(value, data, field) => ...", // 样式函数(可选)
46
+ "formatFunc": "(value, data, field) => ...", // 格式化函数(可选)
47
+ "requireFunc": "(data, field) => ..." // 必填标记函数(可选)
48
+ }
49
+ ]
50
+ }
51
+ ]
52
+ ```
53
+
54
+ ### 全局配置说明
55
+
56
+ #### column - 列数控制
57
+
58
+ - **作用**: 控制每行显示的列数
59
+ - **类型**: `Number`
60
+ - **默认值**: `3`
61
+ - **示例**: `"column": 2` 表示每行显示 2 列
62
+
63
+ #### getRealData - 数据处理方式
64
+
65
+ - **作用**: 是否使用 `getRealKeyData` 方法处理数据
66
+ - **类型**: `Boolean`
67
+ - **默认值**: `false`
68
+ - **示例**: `"getRealData": true` 启用数据处理
69
+
70
+ #### tabMode - 显示模式
71
+
72
+ - **作用**: 控制组件的显示模式
73
+ - **类型**: `String`
74
+ - **可选值**: `'left' | 'top' | 'none'`
75
+ - **默认值**: `'left'`
76
+ - **示例**: `"tabMode": "top"` 使用顶部横向导航
77
+
78
+ ### 分组类型说明
79
+
80
+ #### normal - 普通分组(默认)
81
+
82
+ ```javascript
83
+ [
84
+ {
85
+ "name": "基本信息",
86
+ "type": "normal",
87
+ "fields": [
88
+ {
89
+ "key": "f_name",
90
+ "name": "设备名称"
91
+ }
92
+ ]
93
+ }
94
+ ]
95
+ ```
96
+
97
+ #### array - 数组分组
98
+
99
+ 用于处理数组类型数据,会为每个数组项生成一个子描述:
100
+
101
+ ```javascript
102
+ [
103
+ {
104
+ "name": "设备列表",
105
+ "type": "array",
106
+ "key": "devices",
107
+ "fields": [
108
+ {
109
+ "key": "f_name",
110
+ "name": "设备名称"
111
+ },
112
+ {
113
+ "key": "f_status",
114
+ "name": "设备状态"
115
+ }
116
+ ]
117
+ }
118
+ ]
119
+ ```
120
+
121
+ #### slot - 插槽分组
122
+
123
+ 用于将某个分组交给父组件通过**具名插槽**自定义渲染,适用于配置无法覆盖的展示或交互。
124
+
125
+ **配置说明:**
126
+
127
+ - **name**:分组标题(left/top 模式下作为 Tab 文案,none 模式下可选展示)
128
+ - **type**:`"slot"`,表示该分组为插槽分组
129
+ - **slotName**:字符串,与父组件具名插槽名一致;省略时使用 `name` 作为插槽名
130
+
131
+ **数组格式配置示例:**
132
+
133
+ ```javascript
134
+ [
135
+ {
136
+ "name": "自定义区块",
137
+ "type": "slot",
138
+ "slotName": "customSection"
139
+ }
140
+ ]
141
+ ```
142
+
143
+ **对象格式配置示例:**
144
+
145
+ ```javascript
146
+ {
147
+ "自定义区块": {
148
+ "type": "slot",
149
+ "slotName": "customSection"
150
+ }
151
+ }
152
+ ```
153
+
154
+ **父组件用法:**
155
+
156
+ 通过具名插槽传入内容,插槽名与配置中的 `slotName` 一致。组件会向插槽注入当前详情 `data`,可使用作用域插槽接收:
157
+
158
+ ```html
159
+ <XDescriptionsGroup :data="detail" config-name="xxx">
160
+ <template #customSection="{ data }">
161
+ <div>自定义内容,可访问当前详情 data:{{ data }}</div>
162
+ </template>
163
+ </XDescriptionsGroup>
164
+ ```
165
+
166
+ 若不需要使用 `data`,也可使用默认插槽写法:
167
+
168
+ ```html
169
+ <XDescriptionsGroup :data="detail" config-name="xxx">
170
+ <template #customSection>自定义静态内容</template>
171
+ </XDescriptionsGroup>
172
+ ```
173
+
174
+ ### 字段属性说明
175
+
176
+ #### span - 列宽控制
177
+
178
+ - **作用**: 控制字段占用的列数
179
+ - **类型**: `Number`
180
+ - **默认值**: `1`
181
+ - **示例**: `"span": 2` 表示该字段占用 2 列宽度
182
+
183
+ ### 字段函数说明
184
+
185
+ #### 1. showIf - 条件显示函数
186
+
187
+ - **作用**: 控制字段是否显示
188
+ - **参数**: `(data, field)`
189
+ - **返回值**: `boolean`
190
+ - **示例**: `"showIf": "(data, field) => data.amount > 1000"`
191
+
192
+ #### 2. styleFunc - 样式函数
193
+
194
+ - **作用**: 设置字段内容的样式
195
+ - **参数**: `(value, data, field)`
196
+ - **返回值**: `Object` 样式对象,如 `{color: 'red'}`
197
+ - **示例**: `"styleFunc": "(value, data, field) => ({ color: value > 0 ? 'green' : 'red' })"`
198
+
199
+ #### 3. formatFunc - 格式化函数
200
+
201
+ - **作用**: 自定义字段值的显示格式
202
+ - **参数**: `(value, data, field)`
203
+ - **返回值**: `String` 格式化后的字符串
204
+ - **示例**: `"formatFunc": "(value, data, field) => '¥' + value.toLocaleString()"`
205
+
206
+ #### 4. requireFunc - 必填标记函数
207
+
208
+ - **作用**: 在字段标题后显示红色星号
209
+ - **参数**: `(data, field)`
210
+ - **返回值**: `boolean`
211
+ - **示例**: `"requireFunc": "(data, field) => data.type === 'important'"`
212
+
213
+ #### 4. canEdit - 是否可进行修改
214
+
215
+ - **作用**: 如果canEdit配置为true,则渲染铅笔修改图标,由外部组件实现具体编辑逻辑
216
+ - **参数**: `(field, value, data)`
217
+ - **示例**: `"canEdit": true`
218
+
219
+ ## 完整配置示例
220
+
221
+ ### 普通分组配置示例
222
+
223
+ ```javascript
224
+ // 配置文件:deviceInfo.json
225
+ [
226
+ {
227
+ "name": "基本信息",
228
+ "fields": [
229
+ {
230
+ "key": "f_name",
231
+ "name": "设备名称",
232
+ "span": 2,
233
+ "requireFunc": "true",
234
+ "canEdit": true
235
+ },
236
+ {
237
+ "key": "f_status",
238
+ "name": "状态",
239
+ "showIf": "(data, field) => data.f_status",
240
+ "styleFunc": "(value, data, field) => ({ color: value === '正常' ? 'green' : 'red' })"
241
+ }
242
+ ]
243
+ },
244
+ {
245
+ "name": "财务信息",
246
+ "fields": [
247
+ {
248
+ "key": "f_amount",
249
+ "name": "金额",
250
+ "span": 2,
251
+ "showIf": "(data, field) => data.f_amount > 0",
252
+ "styleFunc": "(value, data, field) => ({ color: value > 5000 ? 'red' : 'green', fontWeight: 'bold' })",
253
+ "formatFunc": "(value, data, field) => '¥' + Number(value).toLocaleString()",
254
+ "requireFunc": "(data, field) => data.f_amount > 1000"
255
+ },
256
+ {
257
+ "key": "f_phone",
258
+ "name": "联系电话",
259
+ "formatFunc": "(value, data, field) => value ? value.replace(/(\\d{3})\\d{4}(\\d{4})/, '$1****$2') : '--'"
260
+ }
261
+ ]
262
+ }
263
+ ]
264
+ ```
265
+
266
+ ### 数组分组配置示例
267
+
268
+ ```javascript
269
+ // 配置文件:deviceList.json
270
+ [
271
+ {
272
+ "name": "设备列表",
273
+ "type": "array",
274
+ "key": "devices",
275
+ "fields": [
276
+ {
277
+ "key": "f_name",
278
+ "name": "设备名称",
279
+ "styleFunc": "(value, data, field) => ({ fontWeight: 'bold' })"
280
+ },
281
+ {
282
+ "key": "f_status",
283
+ "name": "状态",
284
+ "styleFunc": "(value, data, field) => ({ color: value === '在线' ? 'green' : 'gray' })"
285
+ },
286
+ {
287
+ "key": "f_amount",
288
+ "name": "金额",
289
+ "formatFunc": "(value, data, field) => value ? '¥' + value : '--'"
290
+ }
291
+ ]
292
+ }
293
+ ]
294
+ ```
295
+
296
+ ## 使用示例
297
+
298
+ ### 基础使用
299
+
300
+ ```vue
301
+ <template>
302
+ <x-descriptions-group
303
+ :data="deviceData"
304
+ configName="deviceInfo">
305
+ </x-descriptions-group>
306
+ </template>
307
+
308
+ <script>
309
+ import XDescriptionsGroup from '@vue2-client/base-client/components/common/XDescriptions/XDescriptionsGroup'
310
+
311
+ export default {
312
+ components: {
313
+ XDescriptionsGroup
314
+ },
315
+ data () {
316
+ return {
317
+ deviceData: {
318
+ f_name: '智能水表001',
319
+ f_status: '正常',
320
+ f_amount: 15000,
321
+ f_phone: '13812345678'
322
+ }
323
+ }
324
+ }
325
+ }
326
+ </script>
327
+ ```
328
+
329
+ ### 高级用法 - 动态配置
330
+
331
+ ```vue
332
+ <template>
333
+ <x-descriptions-group
334
+ :data="formData"
335
+ :configName="configName"
336
+ serviceName="customService">
337
+ </x-descriptions-group>
338
+ </template>
339
+
340
+ <script>
341
+ export default {
342
+ data () {
343
+ return {
344
+ configName: 'dynamicForm',
345
+ formData: {
346
+ // 根据业务需求动态构建数据
347
+ }
348
+ }
349
+ },
350
+ created() {
351
+ // 根据用户权限动态选择配置
352
+ this.configName = this.isAdmin ? 'adminForm' : 'userForm'
353
+ }
354
+ }
355
+ </script>
356
+ ```
357
+
358
+ ## 注意事项
359
+
360
+ 1. **函数格式**: 所有函数字符串必须使用箭头函数格式,如 `"(data, field) => data.amount > 1000"`
361
+ 2. **错误处理**: 函数执行错误时会输出警告日志,不会影响组件正常渲染
362
+ 3. **性能考虑**: 函数会在每次渲染时执行,避免在函数中编写耗时操作
363
+ 4. **样式应用**: styleFunc 通过内联样式应用到字段内容上,优先级低于CSS类
364
+ 5. **兼容性**: 保持向后兼容,不配置函数的字段按原样显示
365
+
366
+ ## 支持的显示模式
367
+
368
+ 组件支持三种 tab 显示模式,通过配置文件设置:
369
+
370
+ - `left`: 左侧垂直导航(默认)
371
+ - `top`: 顶部横向导航
372
+ - `none`: 无导航,直接显示所有内容
373
+
374
+ 配置示例:
375
+
376
+ ```javascript
377
+ {
378
+ "tabMode": "top",
379
+ "column": 2,
380
+ "groups": [...]
381
+ }
382
+ ```