vue2-client 1.8.147 → 1.8.149

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.8.147",
3
+ "version": "1.8.149",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve --no-eslint",
@@ -7,14 +7,14 @@
7
7
  <a-card v-else>
8
8
  <!-- 切换菜单 -->
9
9
  <a-radio-group v-model="type" default-value="a" button-style="solid" @change="tabChanged">
10
- <a-radio-button value="design">
10
+ <a-radio-button value="design" v-if="!onlyDisplay">
11
11
  设计
12
12
  </a-radio-button>
13
13
  <a-radio-button value="display" style="border-radius: 0">
14
14
  预览
15
15
  </a-radio-button>
16
16
  </a-radio-group>
17
- <a-radio-button @click="saveConfig" style="border-radius: 0 4px 4px 0">
17
+ <a-radio-button @click="saveConfig" style="border-radius: 0 4px 4px 0" v-if="!onlyDisplay">
18
18
  保存
19
19
  </a-radio-button>
20
20
  <!-- 主体表格 -->
@@ -90,6 +90,7 @@ export default {
90
90
  showSkeleton: true,
91
91
  config: undefined,
92
92
  type: 'design',
93
+ onlyDisplay: false,
93
94
  maxColSpan: 12,
94
95
  // 定义是否完成配置的扫描,未完成不要渲染子组件
95
96
  scanFinish: false,
@@ -531,21 +532,29 @@ export default {
531
532
  })
532
533
  }
533
534
  }, 100)
534
- }
535
+ },
536
+ // 初始化JSON配置
537
+ jsonConfigInit () {
538
+ if (this.configData === undefined) {
539
+ console.error('未找到数据!')
540
+ } else {
541
+ this.originalConfig = Object.assign({}, this.localConfig)
542
+ this.originalConfig.data = JSON.parse(JSON.stringify(this.configData))
543
+ this.type = 'display'
544
+ this.onlyDisplay = true
545
+ this.showSkeleton = false
546
+ this.$nextTick(() => {
547
+ this.scanFinish = true
548
+ })
549
+ }
550
+ },
535
551
  },
536
552
  beforeMount () {
537
553
  if (this.localConfig) {
538
- this.config = this.localConfig
539
- if (this.configData !== undefined) {
540
- this.config.data = this.configData
541
- }
542
- if (this.config.data.images === undefined) {
543
- this.config.data.images = {}
544
- }
545
- this.configInit()
546
- } else {
547
- getConfigByName(this.configName, 'af-system', res => {
548
- this.config = res
554
+ if (this.localConfig.designMode === 'json') {
555
+ this.jsonConfigInit()
556
+ } else {
557
+ this.config = this.localConfig
549
558
  if (this.configData !== undefined) {
550
559
  this.config.data = this.configData
551
560
  }
@@ -553,6 +562,21 @@ export default {
553
562
  this.config.data.images = {}
554
563
  }
555
564
  this.configInit()
565
+ }
566
+ } else {
567
+ getConfigByName(this.configName, 'af-system', res => {
568
+ this.config = res
569
+ if (this.config.designMode === 'json') {
570
+ this.jsonConfigInit()
571
+ } else {
572
+ if (this.configData !== undefined) {
573
+ this.config.data = this.configData
574
+ }
575
+ if (this.config.data.images === undefined) {
576
+ this.config.data.images = {}
577
+ }
578
+ this.configInit()
579
+ }
556
580
  })
557
581
  }
558
582
  }
@@ -1,113 +1,121 @@
1
1
  <template>
2
- <div class="reportMain" :style="activatedConfig.width > 0 ? ('width:' + activatedConfig.width + 'px') : undefined">
3
- <!-- 大标题 -->
4
- <h2 class="reportTitle" v-if="activatedConfig.title" v-html="activatedConfig.title"></h2>
5
- <!-- 小标题 / 介乎于标题与表格之间的内容 -->
6
- <div class="subTitle" v-if="activatedConfig.subTitle">
7
- <div class="subTitleItems" v-for="(item, itemIndex) in activatedConfig.subTitle" :key="itemIndex">
8
- <template v-if="item.type === 'column'">
9
- <span>{{ item.text }}</span>
10
- </template>
11
- <template v-else-if="item.type === 'inputs'">
12
- <div class="inputsDiv">
13
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(item.format)" :key="index">
14
- <span class="inputsDivItemLabel">{{ displayFormatStartText(item.format) }}</span>
15
- <template v-if="!forDisplay">
16
- <template v-if="item.inputReadOnly === true">
17
- <a-input v-model="data[item.dataIndex][index]" :style="'width:' + (item.inputWidth ? item.inputWidth : '100') + '%'" :disabled="true"/>
2
+ <div>
3
+ <template v-if="this.activatedConfig.designMode === 'json'">
4
+ <XReportJsonRender :config="activatedConfig"/>
5
+ </template>
6
+ <template v-else>
7
+ <div class="reportMain" :style="activatedConfig.width > 0 ? ('width:' + activatedConfig.width + 'px') : undefined">
8
+ <!-- 大标题 -->
9
+ <h2 class="reportTitle" v-if="activatedConfig.title" v-html="activatedConfig.title"></h2>
10
+ <!-- 小标题 / 介乎于标题与表格之间的内容 -->
11
+ <div class="subTitle" v-if="activatedConfig.subTitle">
12
+ <div class="subTitleItems" v-for="(item, itemIndex) in activatedConfig.subTitle" :key="itemIndex">
13
+ <template v-if="item.type === 'column'">
14
+ <span>{{ item.text }}</span>
15
+ </template>
16
+ <template v-else-if="item.type === 'inputs'">
17
+ <div class="inputsDiv">
18
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(item.format)" :key="index">
19
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(item.format) }}</span>
20
+ <template v-if="!forDisplay">
21
+ <template v-if="item.inputReadOnly === true">
22
+ <a-input v-model="data[item.dataIndex][index]" :style="'width:' + (item.inputWidth ? item.inputWidth : '100') + '%'" :disabled="true"/>
23
+ </template>
24
+ <template v-else>
25
+ <a-input v-model="data[item.dataIndex][index]" :style="'width:' + (item.inputWidth ? item.inputWidth : '100') + '%'"/>
26
+ </template>
27
+ </template>
28
+ <template v-else>
29
+ {{ activatedConfig.data[item.dataIndex][index] }}
30
+ </template>
31
+ <span class="inputsDivItemLabel">{{ displayFormatText(item.format, index) }}</span>
32
+ </div>
33
+ </div>
34
+ </template>
35
+ </div>
36
+ </div>
37
+ <!-- 主体表格 -->
38
+ <table class="reportTable" v-if="render" :style="activatedConfig.style ? activatedConfig.style : undefined">
39
+ <tbody class="reportTable">
40
+ <template v-for="(row, rowIndex) in activatedConfig.columns">
41
+ <!-- 插槽展示 -->
42
+ <!-- <template v-if="row[0].type === 'slot'">-->
43
+ <!-- <XReportSlot :config="activatedConfig" v-if="render" :slot-config-name="row[0].slotConfig" :key="rowIndex" :for-display="forDisplay"></XReportSlot>-->
44
+ <!-- </template>-->
45
+ <!-- 普通行 -->
46
+ <template v-if="row[0].type !== 'inputColumns' && row[0].type !== 'list'">
47
+ <template v-if="!forDisplay">
48
+ <x-report-tr-group :key="rowIndex" :columns="row" :config-data="activatedConfig.data"></x-report-tr-group>
18
49
  </template>
19
50
  <template v-else>
20
- <a-input v-model="data[item.dataIndex][index]" :style="'width:' + (item.inputWidth ? item.inputWidth : '100') + '%'"/>
51
+ <x-report-tr-group :config="activatedConfig" :key="rowIndex" :columns="row" :config-data="activatedConfig.data" :display="true"></x-report-tr-group>
21
52
  </template>
22
53
  </template>
54
+ <!-- 列表 -->
55
+ <template v-else-if="row[0].type === 'list'" v-for="(num, listIndex) in row[0].listLength">
56
+ <template v-if="!forDisplay">
57
+ <x-report-tr-group
58
+ :key="rowIndex + listIndex"
59
+ :columns="row"
60
+ :config-data="activatedConfig.data"
61
+ :list-index="listIndex">
62
+ </x-report-tr-group>
63
+ </template>
64
+ <template v-else>
65
+ <x-report-tr-group
66
+ :config="activatedConfig"
67
+ :key="rowIndex + listIndex"
68
+ :columns="row"
69
+ :config-data="activatedConfig.data"
70
+ :list-index="listIndex"
71
+ :display="true">
72
+ </x-report-tr-group>
73
+ </template>
74
+ </template>
75
+ <!-- 动态行 -->
23
76
  <template v-else>
24
- {{ activatedConfig.data[item.dataIndex][index] }}
77
+ <template v-if="forDisplay">
78
+ <x-report-tr-group
79
+ :columns="row[0].definition"
80
+ :config-data="{arr: activatedConfig.data[row[0].dataIndex]}"
81
+ :input-columns="true"
82
+ v-for="(item, definitionIndex) in activatedConfig.data[row[0].dataIndex]"
83
+ :input-columns-definition-index="definitionIndex"
84
+ :display="true"
85
+ :key="row[0].dataIndex + definitionIndex + rowIndex"></x-report-tr-group>
86
+ </template>
87
+ <template v-if="!forDisplay">
88
+ <x-report-tr-group
89
+ :columns="row[0].definition"
90
+ :config-data="{arr: activatedConfig.data[row[0].dataIndex]}"
91
+ :input-columns="true"
92
+ v-for="(item, definitionIndex) in activatedConfig.data[row[0].dataIndex]"
93
+ :input-columns-definition-index="definitionIndex"
94
+ :key="row[0].dataIndex + definitionIndex + rowIndex"></x-report-tr-group>
95
+ <!-- 动态行交互按钮 -->
96
+ <x-report-tr-group :key="rowIndex" :columns="row" :config-data="activatedConfig.data" :input-columns-button="true" :input-columns="true"></x-report-tr-group>
97
+ </template>
25
98
  </template>
26
- <span class="inputsDivItemLabel">{{ displayFormatText(item.format, index) }}</span>
27
- </div>
28
- </div>
29
- </template>
30
- </div>
31
- </div>
32
- <!-- 主体表格 -->
33
- <table class="reportTable" v-if="render" :style="activatedConfig.style ? activatedConfig.style : undefined">
34
- <tbody class="reportTable">
35
- <template v-for="(row, rowIndex) in activatedConfig.columns">
36
- <!-- 插槽展示 -->
37
- <!-- <template v-if="row[0].type === 'slot'">-->
38
- <!-- <XReportSlot :config="activatedConfig" v-if="render" :slot-config-name="row[0].slotConfig" :key="rowIndex" :for-display="forDisplay"></XReportSlot>-->
39
- <!-- </template>-->
40
- <!-- 普通行 -->
41
- <template v-if="row[0].type !== 'inputColumns' && row[0].type !== 'list'">
42
- <template v-if="!forDisplay">
43
- <x-report-tr-group :key="rowIndex" :columns="row" :config-data="activatedConfig.data"></x-report-tr-group>
44
- </template>
45
- <template v-else>
46
- <x-report-tr-group :config="activatedConfig" :key="rowIndex" :columns="row" :config-data="activatedConfig.data" :display="true"></x-report-tr-group>
47
- </template>
48
- </template>
49
- <!-- 列表 -->
50
- <template v-else-if="row[0].type === 'list'" v-for="(num, listIndex) in row[0].listLength">
51
- <template v-if="!forDisplay">
52
- <x-report-tr-group
53
- :key="rowIndex + listIndex"
54
- :columns="row"
55
- :config-data="activatedConfig.data"
56
- :list-index="listIndex">
57
- </x-report-tr-group>
58
- </template>
59
- <template v-else>
60
- <x-report-tr-group
61
- :config="activatedConfig"
62
- :key="rowIndex + listIndex"
63
- :columns="row"
64
- :config-data="activatedConfig.data"
65
- :list-index="listIndex"
66
- :display="true">
67
- </x-report-tr-group>
68
- </template>
69
- </template>
70
- <!-- 动态行 -->
71
- <template v-else>
72
- <template v-if="forDisplay">
73
- <x-report-tr-group
74
- :columns="row[0].definition"
75
- :config-data="{arr: activatedConfig.data[row[0].dataIndex]}"
76
- :input-columns="true"
77
- v-for="(item, definitionIndex) in activatedConfig.data[row[0].dataIndex]"
78
- :input-columns-definition-index="definitionIndex"
79
- :display="true"
80
- :key="row[0].dataIndex + definitionIndex + rowIndex"></x-report-tr-group>
81
- </template>
82
- <template v-if="!forDisplay">
83
- <x-report-tr-group
84
- :columns="row[0].definition"
85
- :config-data="{arr: activatedConfig.data[row[0].dataIndex]}"
86
- :input-columns="true"
87
- v-for="(item, definitionIndex) in activatedConfig.data[row[0].dataIndex]"
88
- :input-columns-definition-index="definitionIndex"
89
- :key="row[0].dataIndex + definitionIndex + rowIndex"></x-report-tr-group>
90
- <!-- 动态行交互按钮 -->
91
- <x-report-tr-group :key="rowIndex" :columns="row" :config-data="activatedConfig.data" :input-columns-button="true" :input-columns="true"></x-report-tr-group>
92
99
  </template>
100
+ </tbody>
101
+ </table>
102
+ <div v-if="showImages" style="margin-top: 5%; display: flex;margin-bottom: 5%">
103
+ <p>图片:</p>
104
+ <template v-for="(img,imgIndex) in imageList">
105
+ <div :key="imgIndex" style="margin-left: 3%;width: 200px">
106
+ <img :src="img.url" class="img" :alt="img.name"/>
107
+ <p style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;width: 100%;">{{ img.name }}</p>
108
+ </div>
93
109
  </template>
94
- </template>
95
- </tbody>
96
- </table>
97
- <div v-if="showImages" style="margin-top: 5%; display: flex;margin-bottom: 5%">
98
- <p>图片:</p>
99
- <template v-for="(img,imgIndex) in imageList">
100
- <div :key="imgIndex" style="margin-left: 3%;width: 200px">
101
- <img :src="img.url" class="img" :alt="img.name"/>
102
- <p style="overflow: hidden;text-overflow: ellipsis;white-space: nowrap;width: 100%;">{{img.name}}</p>
103
110
  </div>
104
- </template>
105
- </div>
111
+ </div>
112
+ </template>
106
113
  </div>
107
114
  </template>
108
115
 
109
116
  <script>
110
117
  import XReportTrGroup from '@vue2-client/base-client/components/common/XReport/XReportTrGroup.vue'
118
+ import XReportJsonRender from '@vue2-client/base-client/components/common/XReport/XReportJsonRender.vue'
111
119
  import { getConfigByName } from '@vue2-client/services/api/common'
112
120
 
113
121
  export default {
@@ -136,7 +144,8 @@ export default {
136
144
  }
137
145
  },
138
146
  components: {
139
- XReportTrGroup
147
+ XReportTrGroup,
148
+ XReportJsonRender
140
149
  },
141
150
  data () {
142
151
  return {
@@ -0,0 +1,161 @@
1
+ <template>
2
+ <div class="reportMain">
3
+ <table class="reportTable">
4
+ <tbody class="reportTable">
5
+ <tr v-if="config.title.type && config.title.type !== ''">
6
+ <th class="tdWithBorder" colspan="12">
7
+ <template v-if="config.title.type === 'titleKey'">
8
+ {{ config.data[config.title.value] }}
9
+ </template>
10
+ <template v-else-if="config.title.type === 'titleValue'">
11
+ {{ config.title.value }}
12
+ </template>
13
+ </th>
14
+ </tr>
15
+ <template v-for="(row, rowIndex) in config.content">
16
+ <template v-if="row.type === 'jsonKey'">
17
+ <tr :key="rowIndex">
18
+ <!-- 表头 -->
19
+ <td class="tdWithBorder" colspan="6">
20
+ <template v-if="receivedFunction[rowIndex].labelFunction(config).type === 'key'">
21
+ {{ config.data[receivedFunction[rowIndex].labelFunction(config).content] }}
22
+ </template>
23
+ <template v-else-if="receivedFunction[rowIndex].labelFunction(config).type === 'value'">
24
+ {{ receivedFunction[rowIndex].labelFunction(config).content }}
25
+ </template>
26
+ </td>
27
+ <!-- 内容 -->
28
+ <td class="tdWithBorder" colspan="6">
29
+ <template v-if="receivedFunction[rowIndex].valueFunction(config).type === 'key'">
30
+ {{ config.data[receivedFunction[rowIndex].valueFunction(config).content] }}
31
+ </template>
32
+ <template v-else-if="receivedFunction[rowIndex].valueFunction(config).type === 'value'">
33
+ {{ receivedFunction[rowIndex].valueFunction(config).content }}
34
+ </template>
35
+ <template v-else-if="receivedFunction[rowIndex].valueFunction(config).type === 'img'">
36
+ <template v-for="(img, imgIndex) in receivedFunction[rowIndex].valueFunction(config).content">
37
+ <span :key="imgIndex" class="imgText">
38
+ <a-icon type="link"/>
39
+ <span @click="openImgModal(img)">{{ formatImgName(img) }}</span>
40
+ <br/>
41
+ </span>
42
+ </template>
43
+ </template>
44
+ </td>
45
+ </tr>
46
+ </template>
47
+ <template v-else-if="row.type === 'jsonArray'">
48
+ <tr :key="rowIndex + '' + jsonArrayItemIndex" v-for="(item, jsonArrayItemIndex) in config.data[row.jsonArrayDataIndex]">
49
+ <!-- 表头 -->
50
+ <td class="tdWithBorder" colspan="6">
51
+ <template v-if="receivedFunction[rowIndex].labelFunction(config).type === 'key'">
52
+ {{ item[receivedFunction[rowIndex].labelFunction(config).content] }}
53
+ </template>
54
+ <template v-if="receivedFunction[rowIndex].labelFunction(config).type === 'value'">
55
+ {{ receivedFunction[rowIndex].labelFunction(config).content }}
56
+ </template>
57
+ </td>
58
+ <!-- 内容 -->
59
+ <td class="tdWithBorder" colspan="6">
60
+ <template v-if="receivedFunction[rowIndex].valueFunction(config).type === 'key'">
61
+ {{ item[receivedFunction[rowIndex].valueFunction(config).content] }}
62
+ </template>
63
+ <template v-if="receivedFunction[rowIndex].valueFunction(config).type === 'value'">
64
+ {{ receivedFunction[rowIndex].valueFunction(config).content }}
65
+ </template>
66
+ </td>
67
+ </tr>
68
+ </template>
69
+ </template>
70
+ </tbody>
71
+ </table>
72
+ <a-modal
73
+ title="图片"
74
+ width="80%"
75
+ :visible="showImgModal"
76
+ @ok="handleShowImgOk"
77
+ @cancel="handleShowImgCancel"
78
+ :z-index="1001"
79
+ :destroyOnClose="true">
80
+ <div style="width: 100%;display: flex;justify-content: center;align-items: center">
81
+ <img :src="showImageSrc" alt="图片"/>
82
+ </div>
83
+ </a-modal>
84
+ </div>
85
+ </template>
86
+
87
+ <script>
88
+
89
+ export default {
90
+ name: 'XReportJsonRender',
91
+ props: {
92
+ config: {
93
+ type: Object,
94
+ required: true
95
+ }
96
+ },
97
+ data () {
98
+ return {
99
+ receivedFunction: [],
100
+ showImgModal: false,
101
+ showImageSrc: undefined
102
+ }
103
+ },
104
+ methods: {
105
+ handleShowImgOk () {
106
+ this.showImgModal = false
107
+ this.showImageSrc = undefined
108
+ },
109
+ handleShowImgCancel () {
110
+ this.showImgModal = false
111
+ this.showImageSrc = undefined
112
+ },
113
+ openImgModal (img) {
114
+ this.showImageSrc = img
115
+ this.showImgModal = true
116
+ },
117
+ formatImgName (imgSrc) {
118
+ return imgSrc.split('/').pop()
119
+ }
120
+ },
121
+ beforeMount () {
122
+ for (let i = 0; i < this.config.content.length; i++) {
123
+ this.receivedFunction.push({
124
+ // eslint-disable-next-line no-eval
125
+ labelFunction: eval('(' + this.config.content[i].customFunctionForLabel + ')'),
126
+ // eslint-disable-next-line no-eval
127
+ valueFunction: eval('(' + this.config.content[i].customFunctionForValue + ')')
128
+ })
129
+ }
130
+ }
131
+ }
132
+ </script>
133
+
134
+ <style scoped lang="less">
135
+ .reportMain {
136
+ text-align: center;
137
+ margin: 0 auto;
138
+ font-size: 16px;
139
+ color: #000;
140
+ background-color: #fff;
141
+ padding: 15px;
142
+ border-radius: 8px;
143
+ }
144
+ .reportTitle {
145
+ font-weight: bold;
146
+ }
147
+ .reportTable {
148
+ width: 100%;
149
+ border-collapse: collapse;
150
+ table-layout:fixed;
151
+ word-break:break-all;
152
+ }
153
+ .tdWithBorder {
154
+ border: 1px solid #000;
155
+ padding: 8px;
156
+ }
157
+ .imgText:hover {
158
+ color: rgb( 24,144,255);
159
+ cursor: pointer;
160
+ }
161
+ </style>
@@ -229,6 +229,7 @@ export default {
229
229
  }),
230
230
  }
231
231
  },
232
+ ...mapState('account', { currUser: 'user' }),
232
233
  ...mapState('setting', ['compatible'])
233
234
  },
234
235
  mounted () {},
@@ -294,7 +295,7 @@ export default {
294
295
  }
295
296
  }
296
297
  if (!this.isTableTemp) {
297
- result = query(requestParameters, this.serviceName, this.env === 'dev')
298
+ result = query(Object.assign(requestParameters, { userId: this.currUser.id }), this.serviceName, this.env === 'dev')
298
299
  }
299
300
  this.clearRowKeys()
300
301
  this.$emit('afterQuery', result, requestParameters.conditionParams)
@@ -386,6 +387,7 @@ export default {
386
387
  queryParamsName: that.queryParamsName,
387
388
  queryParams: that.queryParams,
388
389
  form: conditionParams,
390
+ userId: this.currUser.id
389
391
  }, that.serviceName, that.env === 'dev').then(res => {
390
392
  let value = res
391
393
  if (that.compatible === 'V4') {
@@ -2,8 +2,9 @@
2
2
  <div>
3
3
  <!-- <XReport :config-name="'test_tableConfig'" :activated-slot-name="'test_tableConfig_slot'"/>-->
4
4
  <!-- <XReport :config-name="'test_tableConfig'" :local-config="test_config_withoutSlot" :config-data="test_config_data"/>-->
5
- <XReport :config-name="'test_tableConfig'" :local-config="test_config_list" :dont-format="true"/>
5
+ <!-- <XReport :config-name="'test_tableConfig'" :local-config="test_config_list" :dont-format="true"/>-->
6
6
  <!-- <XReport :config-name="'test_tableConfig'" />-->
7
+ <XReport config-name="test_tableConfig" :local-config="test_config_json" :config-data="test_config_json_data"/>
7
8
  </div>
8
9
  </template>
9
10
 
@@ -623,6 +624,46 @@ export default {
623
624
  ]
624
625
  ],
625
626
  cardMode: false
627
+ },
628
+ test_config_json: {
629
+ title: {
630
+ type: 'titleKey',
631
+ value: 'f_title'
632
+ },
633
+ content: [
634
+ {
635
+ customFunctionForLabel: "function (config) {\n return { type: 'key', content: 'f_project' }\n}",
636
+ customFunctionForValue: "function (config) {\n if (config.f_content === null) {\n return { type: 'value', content: '无' }\n } else {\n return { type: 'key', content: 'f_content' }\n }\n}",
637
+ type: 'jsonKey'
638
+ },
639
+ {
640
+ customFunctionForLabel: "function (config) {\n return { type: 'key', content: 'f_name' }\n}",
641
+ customFunctionForValue: "function (config) {\n return { type: 'key', content: 'f_content' }\n}",
642
+ jsonArrayDataIndex: 'f_service',
643
+ type: 'jsonArray'
644
+ },
645
+ {
646
+ customFunctionForLabel: "function (config) {\n return { type: 'value', content: '图片' }\n}",
647
+ customFunctionForValue: "function (config) {\n return { type: 'img', content: ['/resource/webmeter/cs/20240419/f73770a2f84749ff82a57c5b708d6a8e.png', '/resource/webmeter/cs/20240419/c15564df1ca840ff9d285b6b240207b1.png'] }\n}",
648
+ type: 'jsonKey'
649
+ }
650
+ ],
651
+ designMode: 'json'
652
+ },
653
+ test_config_json_data: {
654
+ f_title: '我是标题',
655
+ f_project: '服务',
656
+ f_content: null,
657
+ f_service: [
658
+ {
659
+ f_name: '维修1',
660
+ f_content: '第一次上门维修'
661
+ },
662
+ {
663
+ f_name: '保养1',
664
+ f_content: '第一次上门保养'
665
+ }
666
+ ]
626
667
  }
627
668
  }
628
669
  },