vue2-client 1.18.35 → 1.18.37

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 (100) hide show
  1. package/.eslintrc.js +90 -90
  2. package/Components.md +60 -60
  3. package/docs/index.md +30 -30
  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/AmapMarker/index.js +3 -3
  11. package/src/base-client/components/common/CitySelect/CitySelect.vue +9 -1
  12. package/src/base-client/components/common/CitySelect/index.js +3 -3
  13. package/src/base-client/components/common/CitySelect/index.md +109 -109
  14. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  15. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  16. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  17. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  18. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  19. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  20. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  21. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  22. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  23. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  24. package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +22 -0
  25. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  26. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  27. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  28. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  29. package/src/base-client/components/common/Tree/index.js +2 -2
  30. package/src/base-client/components/common/Upload/index.js +3 -3
  31. package/src/base-client/components/common/XAddNativeForm/demo.vue +2 -7
  32. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  33. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  34. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  35. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  36. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  37. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  38. package/src/base-client/components/common/XDescriptions/index.md +322 -322
  39. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  40. package/src/base-client/components/common/XForm/index.md +178 -178
  41. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  42. package/src/base-client/components/common/XFormTable/demo.vue +125 -125
  43. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  44. package/src/base-client/components/common/XStepView/index.js +3 -3
  45. package/src/base-client/components/common/XStepView/index.md +31 -31
  46. package/src/base-client/components/common/XTable/XTable.vue +1715 -1715
  47. package/src/base-client/components/common/XTable/XTableWrapper.vue +759 -756
  48. package/src/base-client/components/common/XTable/index.md +255 -255
  49. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  50. package/src/base-client/plugins/Config.js +19 -19
  51. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  52. package/src/components/Charts/Bar.vue +62 -62
  53. package/src/components/Charts/ChartCard.vue +134 -134
  54. package/src/components/Charts/Liquid.vue +67 -67
  55. package/src/components/Charts/MiniArea.vue +39 -39
  56. package/src/components/Charts/MiniBar.vue +39 -39
  57. package/src/components/Charts/MiniProgress.vue +75 -75
  58. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  59. package/src/components/Charts/Radar.vue +68 -68
  60. package/src/components/Charts/RankList.vue +77 -77
  61. package/src/components/Charts/TagCloud.vue +113 -113
  62. package/src/components/Charts/TransferBar.vue +64 -64
  63. package/src/components/Charts/Trend.vue +82 -82
  64. package/src/components/Charts/chart.less +12 -12
  65. package/src/components/Charts/smooth.area.less +13 -13
  66. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  67. package/src/components/NumberInfo/index.js +3 -3
  68. package/src/components/NumberInfo/index.less +54 -54
  69. package/src/components/NumberInfo/index.md +43 -43
  70. package/src/components/card/ChartCard.vue +79 -79
  71. package/src/components/chart/Bar.vue +60 -60
  72. package/src/components/chart/MiniArea.vue +67 -67
  73. package/src/components/chart/MiniBar.vue +59 -59
  74. package/src/components/chart/MiniProgress.vue +57 -57
  75. package/src/components/chart/Radar.vue +80 -80
  76. package/src/components/chart/RankingList.vue +60 -60
  77. package/src/components/chart/Trend.vue +79 -79
  78. package/src/components/chart/index.less +9 -9
  79. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  80. package/src/components/input/IInput.vue +66 -66
  81. package/src/components/menu/SideMenu.vue +75 -75
  82. package/src/components/menu/menu.js +273 -273
  83. package/src/components/tool/AStepItem.vue +60 -60
  84. package/src/layouts/CommonLayout.vue +56 -56
  85. package/src/layouts/header/HeaderNotice.vue +177 -177
  86. package/src/lib.js +1 -1
  87. package/src/mock/extend/index.js +84 -84
  88. package/src/mock/goods/index.js +108 -108
  89. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +1 -1
  90. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  91. package/src/pages/system/dictionary/index.vue +44 -44
  92. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  93. package/src/pages/system/monitor/operLog/index.vue +37 -37
  94. package/src/router/async/router.map.js +2 -2
  95. package/src/services/api/cas.js +79 -79
  96. package/src/store/modules/setting.js +119 -119
  97. package/src/utils/authority-utils.js +85 -85
  98. package/src/utils/errorCode.js +6 -6
  99. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  100. package/tests/unit/a.log +0 -0
@@ -1,252 +1,252 @@
1
- <template>
2
- <div>
3
- <a-row type="flex">
4
- <a-col :span="stepStyle.flex">
5
- <a-steps
6
- :type="stepStyle.type"
7
- :current="current"
8
- :direction="stepStyle.direction"
9
- :labelPlacement="stepStyle.labelPlacement"
10
- :progressDot="stepStyle.false"
11
- :size="stepStyle.size"
12
- :initial="initial"
13
- :status="status"
14
- @chaneg="onChange"
15
- >
16
- <a-step
17
- v-for="(item, index) in this.configContent.step.steps"
18
- :key="'step-'+item.name"
19
- :title="item.title"
20
- :description="item.description"
21
- :sub-title="item.subTitle"
22
- :disabled="item.disabled">
23
- <a-icon v-if="current === index" slot="icon" :type="iconType" />
24
- </a-step>
25
- </a-steps>
26
- </a-col>
27
- <a-col :span="panelStyle.flex">
28
- <template v-for="(item, index) in this.configContent.step.steps">
29
- <a-card
30
- v-if="current === index"
31
- :bordered="false"
32
- :key="'stepCard-'+item.name">
33
- <template v-if="item.content.card.type === 'text'">
34
- <p>{{ item.content.card.value }}</p>
35
- </template>
36
- <x-add-native-form v-else-if="item.content.card.type === 'form'" :ref="'XAddNativeForm'+ item.name" @onSubmit="submit"/>
37
- <x-table v-else-if="item.content.card.type === 'table'" :fixed-query-form="item.content.card.queryFrom" @action="action" :query-params-name="item.content.card.queryParamsName" :ref="'XAddNativeForm'+item.name" />
38
- <a-button v-if="status === 'error'" @click="success" style="color: v-bind()">下一步</a-button>
39
- </a-card>
40
- </template>
41
- </a-col>
42
- </a-row>
43
- </div>
44
- </template>
45
-
46
- <script>
47
- import XAddNativeForm from '@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'
48
- import { post } from '@vue2-client/services/api'
49
- import XTable from '@vue2-client/base-client/components/common/XTable/XTable.vue'
50
-
51
- export default {
52
- name: 'XStepView',
53
- components: { XTable, XAddNativeForm },
54
- computed: {
55
- stepStyle () {
56
- const style = this.configContent.step.style
57
- if (style) {
58
- return style
59
- } else {
60
- return {
61
- flex: 5,
62
- type: 'default',
63
- progressDot: 'false',
64
- direction: 'horizontal',
65
- labelPlacement: 'horizontal',
66
- size: 'default',
67
- }
68
- }
69
- },
70
- panelStyle () {
71
- const style = this.configContent.panelStyle
72
- if (style) {
73
- return style
74
- } else {
75
- return {
76
- flex: 19
77
- }
78
- }
79
- }
80
-
81
- },
82
- props: {
83
- params: {
84
- type: Object,
85
- required: true,
86
- },
87
- configContent: {
88
- type: Object,
89
- required: true,
90
- }
91
- },
92
- data () {
93
- return {
94
- current: -1,
95
- initial: 0,
96
- status: 'wait',
97
- iconType: 'loading',
98
- timeOut: undefined
99
- }
100
- },
101
- watch: {
102
- async current (newValue) {
103
- this.changeIcon()
104
- if (this.timeOut !== undefined) { window.clearTimeout(this.timeOut) }
105
-
106
- const setpes = this.configContent.step.steps[newValue]
107
- const type = setpes.content.card.type
108
- const formValue = setpes.content.card.value
109
- console.warn('formValue = ', formValue)
110
- if (setpes.before) {
111
- const postName = setpes.before.name.split('@')
112
- this.timeOut = window.setTimeout(() => {
113
- post('/api/af-system/' + postName[0] + '/' + postName[1], setpes.before.params).then(res => {
114
- console.warn(setpes.before.name + '执行结果', res)
115
- if (res.code === 200) {
116
- window.clearInterval(this.timeOut)
117
- this.success()
118
- } else {
119
- setpes.content.card.value = res.msg
120
- }
121
- }).catch(e => {
122
- console.warn(setpes.before.name + '执行结果', e)
123
- window.clearInterval(this.timeOut)
124
- this.error()
125
- })
126
- }, 10 * 1000)
127
- }
128
- if (type === 'form') {
129
- this.$nextTick(() => {
130
- const stepsss = this.$refs['XAddNativeForm' + setpes.name][0]
131
- stepsss.init({
132
- formItems: formValue
133
- })
134
- })
135
- } else if (type === 'table') {
136
- console.warn('formValue = ', formValue)
137
- this.$nextTick(() => {
138
- const stepsss = this.$refs['XAddNativeForm' + setpes.name][0]
139
- stepsss.init({
140
- tableColumns: formValue,
141
- buttonState: {
142
- add: false,
143
- edit: true,
144
- delete: false,
145
- import: false,
146
- export: false
147
- }
148
- })
149
- })
150
- } else {
151
- if (setpes.run) {
152
- post('/api/af-system/logic/' + setpes.run.name, setpes.run.params).then(t => {
153
- console.warn(setpes.run.name + '执行结果', t)
154
- if (t.code === 200) {
155
- this.success()
156
- } else {
157
- setpes.content.card.value = t.msg
158
- }
159
- }).catch(e => {
160
- console.warn(setpes.run.name + '执行结果', e)
161
- this.error()
162
- })
163
- }
164
- }
165
- }
166
- },
167
- mounted () {
168
- let paramsStr = JSON.stringify(this.configContent.step)
169
- for (const item in this.params) {
170
- const regex = new RegExp('\\$\\{' + item + '\\}', 'g')
171
- paramsStr = paramsStr.replace(regex, this.params[item])
172
- }
173
- const params = JSON.parse(paramsStr)
174
- this.init({ step: params })
175
- this.current++
176
- },
177
- methods: {
178
- init (params) {
179
- const {
180
- style,
181
- panel,
182
- step
183
- } = params
184
- if (style) {
185
- this.stepStyle = style
186
- }
187
- if (panel) {
188
- this.panelStyle = panel
189
- }
190
- if (step) {
191
- this.configContent.step = step
192
- }
193
- },
194
- steps () {
195
- return this.steps
196
- },
197
- onChange (current) {
198
- this.current = current
199
- },
200
- submit (res) {
201
- console.warn('res', res)
202
- const setpes = this.configContent.step.steps[this.current]
203
- if (setpes.run) {
204
- post('/api/af-system/logic/' + setpes.run.name, res.realForm).then(t => {
205
- console.warn(setpes.run.name + '执行结果', t)
206
- if (t.code === 200) {
207
- this.success()
208
- }
209
- }).catch(e => {
210
- console.warn(setpes.run.name + '执行结果', e)
211
- this.error()
212
- })
213
- }
214
- },
215
- error () {
216
- this.status = 'error'
217
- this.iconType = 'close-circle'
218
- },
219
- success () {
220
- this.changeIcon()
221
-
222
- this.current++
223
- },
224
- changeIcon () {
225
- this.status = 'wait'
226
- this.iconType = 'loading'
227
- },
228
- previous () {
229
- this.current--
230
- },
231
- action (record, id, actionType) {
232
- console.warn('record', record)
233
- console.warn('id', id)
234
- console.warn('actionType', actionType)
235
- const setpes = this.configContent.step.steps[this.current]
236
- if (setpes.run) {
237
- post('/api/af-system/logic/' + setpes.run.name, { data: record }).then(t => {
238
- console.warn(setpes.run.name + '执行结果', t)
239
- if (t.code === 200) {
240
- this.success()
241
- }
242
- }).catch(e => {
243
- console.warn(setpes.run.name + '执行结果', e)
244
- this.error()
245
- })
246
- }
247
- }
248
- },
249
- }
250
- </script>
251
-
252
- <style lang="less" scoped></style>
1
+ <template>
2
+ <div>
3
+ <a-row type="flex">
4
+ <a-col :span="stepStyle.flex">
5
+ <a-steps
6
+ :type="stepStyle.type"
7
+ :current="current"
8
+ :direction="stepStyle.direction"
9
+ :labelPlacement="stepStyle.labelPlacement"
10
+ :progressDot="stepStyle.false"
11
+ :size="stepStyle.size"
12
+ :initial="initial"
13
+ :status="status"
14
+ @chaneg="onChange"
15
+ >
16
+ <a-step
17
+ v-for="(item, index) in this.configContent.step.steps"
18
+ :key="'step-'+item.name"
19
+ :title="item.title"
20
+ :description="item.description"
21
+ :sub-title="item.subTitle"
22
+ :disabled="item.disabled">
23
+ <a-icon v-if="current === index" slot="icon" :type="iconType" />
24
+ </a-step>
25
+ </a-steps>
26
+ </a-col>
27
+ <a-col :span="panelStyle.flex">
28
+ <template v-for="(item, index) in this.configContent.step.steps">
29
+ <a-card
30
+ v-if="current === index"
31
+ :bordered="false"
32
+ :key="'stepCard-'+item.name">
33
+ <template v-if="item.content.card.type === 'text'">
34
+ <p>{{ item.content.card.value }}</p>
35
+ </template>
36
+ <x-add-native-form v-else-if="item.content.card.type === 'form'" :ref="'XAddNativeForm'+ item.name" @onSubmit="submit"/>
37
+ <x-table v-else-if="item.content.card.type === 'table'" :fixed-query-form="item.content.card.queryFrom" @action="action" :query-params-name="item.content.card.queryParamsName" :ref="'XAddNativeForm'+item.name" />
38
+ <a-button v-if="status === 'error'" @click="success" style="color: v-bind()">下一步</a-button>
39
+ </a-card>
40
+ </template>
41
+ </a-col>
42
+ </a-row>
43
+ </div>
44
+ </template>
45
+
46
+ <script>
47
+ import XAddNativeForm from '@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'
48
+ import { post } from '@vue2-client/services/api'
49
+ import XTable from '@vue2-client/base-client/components/common/XTable/XTable.vue'
50
+
51
+ export default {
52
+ name: 'XStepView',
53
+ components: { XTable, XAddNativeForm },
54
+ computed: {
55
+ stepStyle () {
56
+ const style = this.configContent.step.style
57
+ if (style) {
58
+ return style
59
+ } else {
60
+ return {
61
+ flex: 5,
62
+ type: 'default',
63
+ progressDot: 'false',
64
+ direction: 'horizontal',
65
+ labelPlacement: 'horizontal',
66
+ size: 'default',
67
+ }
68
+ }
69
+ },
70
+ panelStyle () {
71
+ const style = this.configContent.panelStyle
72
+ if (style) {
73
+ return style
74
+ } else {
75
+ return {
76
+ flex: 19
77
+ }
78
+ }
79
+ }
80
+
81
+ },
82
+ props: {
83
+ params: {
84
+ type: Object,
85
+ required: true,
86
+ },
87
+ configContent: {
88
+ type: Object,
89
+ required: true,
90
+ }
91
+ },
92
+ data () {
93
+ return {
94
+ current: -1,
95
+ initial: 0,
96
+ status: 'wait',
97
+ iconType: 'loading',
98
+ timeOut: undefined
99
+ }
100
+ },
101
+ watch: {
102
+ async current (newValue) {
103
+ this.changeIcon()
104
+ if (this.timeOut !== undefined) { window.clearTimeout(this.timeOut) }
105
+
106
+ const setpes = this.configContent.step.steps[newValue]
107
+ const type = setpes.content.card.type
108
+ const formValue = setpes.content.card.value
109
+ console.warn('formValue = ', formValue)
110
+ if (setpes.before) {
111
+ const postName = setpes.before.name.split('@')
112
+ this.timeOut = window.setTimeout(() => {
113
+ post('/api/af-system/' + postName[0] + '/' + postName[1], setpes.before.params).then(res => {
114
+ console.warn(setpes.before.name + '执行结果', res)
115
+ if (res.code === 200) {
116
+ window.clearInterval(this.timeOut)
117
+ this.success()
118
+ } else {
119
+ setpes.content.card.value = res.msg
120
+ }
121
+ }).catch(e => {
122
+ console.warn(setpes.before.name + '执行结果', e)
123
+ window.clearInterval(this.timeOut)
124
+ this.error()
125
+ })
126
+ }, 10 * 1000)
127
+ }
128
+ if (type === 'form') {
129
+ this.$nextTick(() => {
130
+ const stepsss = this.$refs['XAddNativeForm' + setpes.name][0]
131
+ stepsss.init({
132
+ formItems: formValue
133
+ })
134
+ })
135
+ } else if (type === 'table') {
136
+ console.warn('formValue = ', formValue)
137
+ this.$nextTick(() => {
138
+ const stepsss = this.$refs['XAddNativeForm' + setpes.name][0]
139
+ stepsss.init({
140
+ tableColumns: formValue,
141
+ buttonState: {
142
+ add: false,
143
+ edit: true,
144
+ delete: false,
145
+ import: false,
146
+ export: false
147
+ }
148
+ })
149
+ })
150
+ } else {
151
+ if (setpes.run) {
152
+ post('/api/af-system/logic/' + setpes.run.name, setpes.run.params).then(t => {
153
+ console.warn(setpes.run.name + '执行结果', t)
154
+ if (t.code === 200) {
155
+ this.success()
156
+ } else {
157
+ setpes.content.card.value = t.msg
158
+ }
159
+ }).catch(e => {
160
+ console.warn(setpes.run.name + '执行结果', e)
161
+ this.error()
162
+ })
163
+ }
164
+ }
165
+ }
166
+ },
167
+ mounted () {
168
+ let paramsStr = JSON.stringify(this.configContent.step)
169
+ for (const item in this.params) {
170
+ const regex = new RegExp('\\$\\{' + item + '\\}', 'g')
171
+ paramsStr = paramsStr.replace(regex, this.params[item])
172
+ }
173
+ const params = JSON.parse(paramsStr)
174
+ this.init({ step: params })
175
+ this.current++
176
+ },
177
+ methods: {
178
+ init (params) {
179
+ const {
180
+ style,
181
+ panel,
182
+ step
183
+ } = params
184
+ if (style) {
185
+ this.stepStyle = style
186
+ }
187
+ if (panel) {
188
+ this.panelStyle = panel
189
+ }
190
+ if (step) {
191
+ this.configContent.step = step
192
+ }
193
+ },
194
+ steps () {
195
+ return this.steps
196
+ },
197
+ onChange (current) {
198
+ this.current = current
199
+ },
200
+ submit (res) {
201
+ console.warn('res', res)
202
+ const setpes = this.configContent.step.steps[this.current]
203
+ if (setpes.run) {
204
+ post('/api/af-system/logic/' + setpes.run.name, res.realForm).then(t => {
205
+ console.warn(setpes.run.name + '执行结果', t)
206
+ if (t.code === 200) {
207
+ this.success()
208
+ }
209
+ }).catch(e => {
210
+ console.warn(setpes.run.name + '执行结果', e)
211
+ this.error()
212
+ })
213
+ }
214
+ },
215
+ error () {
216
+ this.status = 'error'
217
+ this.iconType = 'close-circle'
218
+ },
219
+ success () {
220
+ this.changeIcon()
221
+
222
+ this.current++
223
+ },
224
+ changeIcon () {
225
+ this.status = 'wait'
226
+ this.iconType = 'loading'
227
+ },
228
+ previous () {
229
+ this.current--
230
+ },
231
+ action (record, id, actionType) {
232
+ console.warn('record', record)
233
+ console.warn('id', id)
234
+ console.warn('actionType', actionType)
235
+ const setpes = this.configContent.step.steps[this.current]
236
+ if (setpes.run) {
237
+ post('/api/af-system/logic/' + setpes.run.name, { data: record }).then(t => {
238
+ console.warn(setpes.run.name + '执行结果', t)
239
+ if (t.code === 200) {
240
+ this.success()
241
+ }
242
+ }).catch(e => {
243
+ console.warn(setpes.run.name + '执行结果', e)
244
+ this.error()
245
+ })
246
+ }
247
+ }
248
+ },
249
+ }
250
+ </script>
251
+
252
+ <style lang="less" scoped></style>
@@ -1,3 +1,3 @@
1
- import XStepView from './XStepView.vue'
2
-
3
- export default XStepView
1
+ import XStepView from './XStepView.vue'
2
+
3
+ export default XStepView
@@ -1,31 +1,31 @@
1
- # XStepView 通用步骤视图
2
-
3
- 通用步骤视图,根据JSON配置生成一个完整的通用步骤视图
4
-
5
-
6
-
7
- ## 何时使用
8
-
9
- 当需要一个可以JSON配置生成一个完整的通用步骤视图时
10
-
11
-
12
- 引用方式:
13
-
14
- ```javascript
15
- import XStepView from '@vue2-client/base-client/components/XStepView'
16
-
17
- export default {
18
- components: {
19
- XStepView
20
- }
21
- }
22
- ```
23
-
24
-
25
-
26
- ## 代码演示
27
- ```html
28
- <x-step-view
29
- :params = 'json'
30
- />
31
- ```
1
+ # XStepView 通用步骤视图
2
+
3
+ 通用步骤视图,根据JSON配置生成一个完整的通用步骤视图
4
+
5
+
6
+
7
+ ## 何时使用
8
+
9
+ 当需要一个可以JSON配置生成一个完整的通用步骤视图时
10
+
11
+
12
+ 引用方式:
13
+
14
+ ```javascript
15
+ import XStepView from '@vue2-client/base-client/components/XStepView'
16
+
17
+ export default {
18
+ components: {
19
+ XStepView
20
+ }
21
+ }
22
+ ```
23
+
24
+
25
+
26
+ ## 代码演示
27
+ ```html
28
+ <x-step-view
29
+ :params = 'json'
30
+ />
31
+ ```