Skip to content

Commit 132f56e

Browse files
author
jiangchunfu
committed
refactor: 设置器加载统一,代码优化 #269
1 parent 136cdfb commit 132f56e

File tree

4 files changed

+53
-186
lines changed

4 files changed

+53
-186
lines changed

web/src/management/pages/edit/components/SetterField.vue

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
</el-form>
3838
</template>
3939
<script setup lang="ts">
40-
import { watch, ref, shallowRef } from 'vue'
41-
import { get as _get, pick as _pick, isFunction as _isFunction } from 'lodash-es'
40+
import { watch, ref, shallowRef, type Component } from 'vue'
41+
import { get as _get, pick as _pick, isFunction as _isFunction, values as _values } from 'lodash-es'
4242
4343
import FormItem from '@/materials/setters/widgets/FormItem.vue'
4444
import setterLoader from '@/materials/setters/setterLoader'
@@ -48,6 +48,7 @@ import { FORM_CHANGE_EVENT_KEY } from '@/materials/setters/constant'
4848
interface Props {
4949
formConfigList: Array<any>
5050
moduleConfig: any
51+
customComponents?: Record<string, Component>
5152
}
5253
5354
interface Emit {
@@ -70,7 +71,7 @@ const formatValue = ({ item, moduleConfig }: any) => {
7071
result = _get(moduleConfig, key, item.value)
7172
}
7273
if (keys) {
73-
result = _pick(moduleConfig, keys)
74+
result = _values(_pick(moduleConfig, keys))
7475
}
7576
7677
return result
@@ -79,7 +80,7 @@ const formatValue = ({ item, moduleConfig }: any) => {
7980
8081
const formFieldData = ref<Array<any>>([])
8182
const init = ref<boolean>(true)
82-
const components = shallowRef<any>({})
83+
const components = shallowRef<any>(props.customComponents || {})
8384
8485
const handleFormChange = (data: any, formConfig: any) => {
8586
if (_isFunction(formConfig?.valueSetter)) {
@@ -132,13 +133,15 @@ const normalizationValues = (configList: Array<any> = []) => {
132133
const registerComponents = async (formFieldData: any) => {
133134
let innerSetters: Array<any> = []
134135
135-
const setters = formFieldData.map((item: any) => {
136-
if (item.type === 'Customed') {
137-
innerSetters.push(...(item.content || []).map((content: any) => content.type))
138-
}
136+
const setters = formFieldData
137+
.filter((item: any) => !item.custom)
138+
.map((item: any) => {
139+
if (item.type === 'Customed') {
140+
innerSetters.push(...(item.content || []).map((content: any) => content.type))
141+
}
139142
140-
return item.type
141-
})
143+
return item.type
144+
})
142145
143146
const settersSet = new Set([...setters, ...innerSetters])
144147
const settersArr = Array.from(settersSet)

web/src/management/pages/edit/modules/resultModule/SetterPanel.vue

Lines changed: 9 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,23 @@
33
<div class="setter-title">
44
{{ currentEditText }}
55
</div>
6-
<el-form class="question-config-form" label-position="top" @submit.prevent>
7-
<template v-for="(item, index) in formFields" :key="index">
8-
<FormItem
9-
v-if="item.type && !item.hidden && Boolean(registerTypes[item.type])"
10-
:form-config="item"
11-
:style="item.style"
12-
>
13-
<Component
14-
v-if="Boolean(registerTypes[item.type])"
15-
:is="components[item.type]"
16-
:module-config="moduleConfig"
17-
:form-config="item"
18-
@form-change="handleFormChange"
19-
/>
20-
</FormItem>
21-
</template>
22-
</el-form>
6+
<SetterField
7+
class="question-config-form"
8+
label-position="top"
9+
:form-config-list="formFields"
10+
:module-config="moduleConfig"
11+
@form-change="handleFormChange"
12+
/>
2313
</div>
2414
</template>
2515
<script setup lang="ts">
26-
import { computed, ref, shallowRef, toRef } from 'vue'
16+
import { computed, toRef } from 'vue'
2717
import { storeToRefs } from 'pinia'
2818
import { useEditStore } from '@/management/stores/edit'
2919
import { get as _get } from 'lodash-es'
3020
31-
import FormItem from '@/materials/setters/widgets/FormItem.vue'
32-
import setterLoader from '@/materials/setters/setterLoader'
3321
import statusConfig from '@/management/pages/edit/setterConfig/statusConfig'
22+
import SetterField from '@/management/pages/edit/components/SetterField.vue'
3423
3524
const textMap = {
3625
Success: '提交成功页面配置',
@@ -41,8 +30,6 @@ const editStore = useEditStore()
4130
const { currentEditStatus } = storeToRefs(editStore)
4231
const { schema, changeSchema } = editStore
4332
44-
const components = shallowRef<any>({})
45-
const registerTypes = ref<any>({})
4633
const moduleConfig = toRef(schema, 'submitConf')
4734
const currentEditText = computed(() => (textMap as any)[currentEditStatus.value])
4835
const formFields = computed(() => {
@@ -53,8 +40,6 @@ const formFields = computed(() => {
5340
return { ...item, value }
5441
})
5542
56-
registerComponents(list)
57-
5843
return list
5944
})
6045
@@ -64,39 +49,6 @@ const handleFormChange = ({ key, value }: any) => {
6449
value
6550
})
6651
}
67-
68-
const registerComponents = async (formFieldData: any) => {
69-
const setters = formFieldData.map((item: any) => item.type)
70-
const settersSet = new Set(setters)
71-
const settersArr = Array.from(settersSet)
72-
const allSetters = settersArr.map((item) => {
73-
return {
74-
type: item,
75-
path: item
76-
}
77-
})
78-
79-
try {
80-
const comps = await setterLoader.loadComponents(allSetters)
81-
82-
for (const comp of comps) {
83-
if (!comp) {
84-
continue
85-
}
86-
87-
const { type, component, err } = comp
88-
89-
if (!err) {
90-
const componentName = component.name
91-
92-
components.value[type] = component
93-
registerTypes.value[type] = componentName
94-
}
95-
}
96-
} catch (err) {
97-
console.error(err)
98-
}
99-
}
10052
</script>
10153
<style lang="scss" scoped>
10254
.question-edit-form {

web/src/management/pages/edit/modules/settingModule/SettingPanel.vue

Lines changed: 22 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -2,146 +2,57 @@
22
<div class="question-config">
33
<div class="question-config-wrapper">
44
<div class="question-config-main">
5-
<div v-for="form of setterList" :key="form.key" class="config-item">
5+
<div v-for="form of formConfigList" :key="form.key" class="config-item">
66
<div class="config-title">
77
<span>
88
{{ form.title }}
99
</span>
1010
</div>
11-
<el-form
11+
<SetterField
12+
:key="form.key"
1213
class="question-config-form"
1314
label-position="left"
1415
label-width="200px"
15-
@submit.prevent
16-
>
17-
<template v-for="(item, index) in form.formList">
18-
<FormItem
19-
v-if="item.type && !item.hidden && Boolean(registerTypes[item.type])"
20-
:key="index"
21-
:form-config="item"
22-
:style="item.style"
23-
>
24-
<Component
25-
v-if="Boolean(registerTypes[item.type])"
26-
:is="components[item.type]"
27-
:module-config="form.dataConfig"
28-
:form-config="item"
29-
@form-change="handleFormChange"
30-
/>
31-
</FormItem>
32-
</template>
33-
</el-form>
16+
:form-config-list="form.formList"
17+
:module-config="baseConf"
18+
:custom-components="{
19+
WhiteList,
20+
TeamMemberList
21+
}"
22+
@form-change="handleFormChange"
23+
></SetterField>
3424
</div>
3525
</div>
3626
</div>
3727
</div>
3828
</template>
3929
<script setup lang="ts">
40-
import { computed, ref, onMounted, shallowRef } from 'vue'
41-
import {
42-
cloneDeep as _cloneDeep,
43-
isArray as _isArray,
44-
get as _get,
45-
isFunction as _isFunction
46-
} from 'lodash-es'
30+
import { ref, toRef } from 'vue'
4731
import { useEditStore } from '@/management/stores/edit'
4832
4933
import baseConfig from '@/management/pages/edit/setterConfig/baseConfig'
5034
import baseFormConfig from '@/management/pages/edit/setterConfig/baseFormConfig'
51-
import FormItem from '@/materials/setters/widgets/FormItem.vue'
52-
import setterLoader from '@/materials/setters/setterLoader'
35+
import SetterField from '@/management/pages/edit/components/SetterField.vue'
5336
5437
import WhiteList from './components/WhiteList.vue'
5538
import TeamMemberList from './components/TeamMemberList.vue'
5639
5740
const editStore = useEditStore()
5841
const { schema, changeSchema } = editStore
42+
const baseConf = toRef(schema, 'baseConf')
5943
60-
const formConfigList = ref<Array<any>>([])
61-
const components = shallowRef<any>({
62-
['WhiteList']: WhiteList,
63-
['TeamMemberList']: TeamMemberList
64-
})
65-
// 登记默认注册的高级设置器组件
66-
const registerTypes = ref<any>({
67-
WhiteList: 'WhiteList',
68-
TeamMemberList: 'TeamMemberList'
69-
})
44+
const baseConfigWithFormList = baseConfig.map((item) => ({
45+
...item,
46+
formList: item.formList.map((key) => (baseFormConfig as any)[key]).filter((config) => !!config)
47+
}))
48+
const formConfigList = ref<Array<any>>(baseConfigWithFormList)
7049
71-
const schemaBaseConf = computed(() => schema?.baseConf || {})
72-
73-
const setterList = computed(() => {
74-
const list = _cloneDeep(formConfigList.value)
75-
76-
return list.map((form) => {
77-
const dataConfig: any = {}
78-
79-
for (const formItem of form.formList) {
80-
const formKey = formItem.key ? formItem.key : formItem.keys
81-
let formValue
82-
if (_isArray(formKey)) {
83-
formValue = []
84-
for (const key of formKey) {
85-
const val = _get(schema, key, formItem.value)
86-
formValue.push(val)
87-
dataConfig[key] = val
88-
}
89-
} else {
90-
formValue = _get(schema, formKey, formItem.value)
91-
dataConfig[formKey] = formValue
92-
}
93-
formItem.value = formValue
94-
}
95-
// 动态显隐设置器
96-
form.formList = form.formList.filter((item: any) => {
97-
if (_isFunction(item.relyFunc)) {
98-
return item.relyFunc(schemaBaseConf.value)
99-
}
100-
return true
101-
})
102-
103-
form.dataConfig = dataConfig
104-
105-
return form
106-
})
107-
})
108-
109-
const handleFormChange = (data: any) => {
50+
const handleFormChange = ({ key, value }: any) => {
11051
changeSchema({
111-
key: data.key,
112-
value: data.value
52+
key: `baseConf.${key}`,
53+
value: value
11354
})
11455
}
115-
116-
onMounted(async () => {
117-
formConfigList.value = baseConfig.map((item) => ({
118-
...item,
119-
formList: item.formList.map((key) => (baseFormConfig as any)[key]).filter((config) => !!config)
120-
}))
121-
122-
const formList = formConfigList.value.map((item) => item.formList).flat()
123-
const typeList = formList
124-
.filter((item) => !item.custom)
125-
.map((item) => ({
126-
type: item.type,
127-
path: item.path || item.type
128-
}))
129-
130-
const comps = await setterLoader.loadComponents(typeList)
131-
for (const comp of comps) {
132-
if (!comp) {
133-
continue
134-
}
135-
136-
const { type, component, err } = comp
137-
if (!err) {
138-
const componentName = component.name
139-
140-
components.value[type] = component
141-
registerTypes.value[type] = componentName
142-
}
143-
}
144-
})
14556
</script>
14657

14758
<style lang="scss" scoped>

0 commit comments

Comments
 (0)