Commit ae595fc77322a81ca7757cac6738006109688eda
1 parent
d383b52e
feat:新增数据转换,新增,删除,批量删除,编辑,查询,fix:待修复启用
Showing
13 changed files
with
1760 additions
and
213 deletions
src/api/datamanager/dataManagerApi.ts
0 → 100644
1 | +import { defHttp } from '/@/utils/http/axios'; | |
2 | +import { | |
3 | + IDataManagerModel, | |
4 | + IEnableOrDisableModel, | |
5 | + TDataManagerModelQuery, | |
6 | +} from './model/dataManagerModel'; | |
7 | + | |
8 | +enum DataManagerApi { | |
9 | + DATA_MANAGER_CONVERT_ADD_OR_EDIT = '/convert', | |
10 | + DATA_MANAGER_CONVERT_DELETE = '/convert', | |
11 | + DATA_MANAGER_CONVERT_POST_CHECK_NAME = '/convert/check', | |
12 | + DATA_MANAGER_CONVERT_POST_ENABLE_OR_DISABLED = '/convert/update', | |
13 | + DATA_MANAGER_CONVERT_GET = '/convert', | |
14 | +} | |
15 | + | |
16 | +// 转换配置分页查询 | |
17 | +export const getConvertApi = (params: TDataManagerModelQuery) => { | |
18 | + return defHttp.get<TDataManagerModelQuery>({ | |
19 | + url: DataManagerApi.DATA_MANAGER_CONVERT_GET, | |
20 | + params, | |
21 | + }); | |
22 | +}; | |
23 | + | |
24 | +// 添加或修改转换配置 | |
25 | +export const postAddConvertApi = (params: IDataManagerModel) => { | |
26 | + return defHttp.post<IDataManagerModel>({ | |
27 | + url: DataManagerApi.DATA_MANAGER_CONVERT_ADD_OR_EDIT, | |
28 | + params, | |
29 | + }); | |
30 | +}; | |
31 | + | |
32 | +//删除转换配置 | |
33 | +export const deleteConvertApi = (ids: string[]) => { | |
34 | + return defHttp.delete({ | |
35 | + url: DataManagerApi.DATA_MANAGER_CONVERT_DELETE, | |
36 | + data: { | |
37 | + ids: ids, | |
38 | + }, | |
39 | + }); | |
40 | +}; | |
41 | + | |
42 | +// 查询配置名称是否存在 | |
43 | +export const isExistDataManagerNameApi = (params?: TDataManagerModelQuery) => { | |
44 | + return defHttp.get({ | |
45 | + url: DataManagerApi.DATA_MANAGER_CONVERT_POST_CHECK_NAME, | |
46 | + params, | |
47 | + }); | |
48 | +}; | |
49 | + | |
50 | +// 启用或者禁用配置 | |
51 | +export const isEnableOrDisableApi = (params: IEnableOrDisableModel) => { | |
52 | + return defHttp.post<IEnableOrDisableModel>({ | |
53 | + url: DataManagerApi.DATA_MANAGER_CONVERT_POST_ENABLE_OR_DISABLED, | |
54 | + params, | |
55 | + }); | |
56 | +}; | ... | ... |
1 | +import { BasicPageParams } from '/@/api/model/baseModel'; | |
2 | + | |
3 | +export type TDataManagerModelQuery = BasicPageParams & TDataManagerParam; | |
4 | + | |
5 | +export type TDataManagerParam = { | |
6 | + name?: string; | |
7 | + status?: string; | |
8 | +}; | |
9 | + | |
10 | +export interface IDataManagerModel { | |
11 | + configuration?: {}; | |
12 | + createTime?: string; | |
13 | + creator?: string; | |
14 | + defaultConfig?: string; | |
15 | + description?: string; | |
16 | + enabled?: true; | |
17 | + icon?: string; | |
18 | + id?: string; | |
19 | + name?: string; | |
20 | + roleIds?: []; | |
21 | + status?: 0; | |
22 | + tenantExpireTime?: string; | |
23 | + tenantId?: string; | |
24 | + tenantProfileId?: string; | |
25 | + tenantStatus?: string; | |
26 | + type?: string; | |
27 | + updateTime?: string; | |
28 | + updater?: string; | |
29 | +} | |
30 | + | |
31 | +export interface IEnableOrDisableModel { | |
32 | + convertIds?: [string]; | |
33 | + status?: number; | |
34 | +} | ... | ... |
... | ... | @@ -14,18 +14,35 @@ |
14 | 14 | </a-steps> |
15 | 15 | </div> |
16 | 16 | <div> |
17 | - <div v-show="current === 0"> <TransferConfigMode @next="handleNext" /></div> | |
18 | - <div v-show="current === 1"> <TransferConfigParams @prev="handlePrev" /></div> | |
17 | + <div v-show="current === 0"> | |
18 | + <TransferConfigMode ref="refTransferConfigMode" @next="handleNext" | |
19 | + /></div> | |
20 | + <div v-show="current === 1"> | |
21 | + <TransferConfigParams | |
22 | + ref="refTransferConfigParams" | |
23 | + :getModeSelect="getModeSelectVal" | |
24 | + @prevSon="handlePrev" | |
25 | + /></div> | |
19 | 26 | </div> |
20 | 27 | </BasicModal> |
21 | 28 | </div> |
22 | 29 | </template> |
23 | 30 | <script lang="ts"> |
24 | - import { defineComponent, ref, computed, unref } from 'vue'; | |
31 | + import { | |
32 | + defineComponent, | |
33 | + reactive, | |
34 | + ref, | |
35 | + nextTick, | |
36 | + computed, | |
37 | + unref, | |
38 | + getCurrentInstance, | |
39 | + } from 'vue'; | |
25 | 40 | import { BasicModal, useModalInner } from '/@/components/Modal'; |
26 | 41 | import { Steps } from 'ant-design-vue'; |
27 | 42 | import TransferConfigMode from './cpns/transferConfigMode.vue'; |
28 | 43 | import TransferConfigParams from './cpns/transferConfigParams.vue'; |
44 | + import { postAddConvertApi } from '/@/api/datamanager/dataManagerApi'; | |
45 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
29 | 46 | |
30 | 47 | export default defineComponent({ |
31 | 48 | name: 'ConfigDrawer', |
... | ... | @@ -36,22 +53,130 @@ |
36 | 53 | TransferConfigMode, |
37 | 54 | TransferConfigParams, |
38 | 55 | }, |
39 | - setup() { | |
56 | + emits: ['success'], | |
57 | + setup(_, { emit }) { | |
58 | + const { createMessage } = useMessage(); | |
59 | + const { proxy } = getCurrentInstance(); | |
60 | + const allPostForm = reactive({}); | |
61 | + const getNameObj = reactive({ | |
62 | + name: '', | |
63 | + }); | |
64 | + const getTypeObj = reactive({ | |
65 | + type: '', | |
66 | + }); | |
67 | + const getSonFormValue = ref({}); | |
68 | + const getModeSonFormValue = ref({}); | |
69 | + const refTransferConfigParams = ref(null); | |
70 | + const refTransferConfigMode = ref(null); | |
71 | + const getModeSelectVal = ref({}); | |
40 | 72 | const isUpdate = ref(true); |
41 | 73 | const getTitle = computed(() => (!unref(isUpdate) ? '新增转换配置' : '编辑数据转换')); |
42 | 74 | const current = ref(0); |
75 | + const editPostId = ref(''); | |
43 | 76 | |
44 | - const [registerDrawer] = useModalInner(async (data) => { | |
77 | + const [registerDrawer, { closeModal }] = useModalInner(async (data) => { | |
45 | 78 | isUpdate.value = !!data?.isUpdate; |
46 | 79 | current.value = 0; |
80 | + if (!unref(isUpdate)) { | |
81 | + try { | |
82 | + proxy.$refs.refTransferConfigMode.customResetStepOneFunc(); | |
83 | + // nextTick(() => { | |
84 | + // proxy.$refs.refTransferConfigParams.clearSonValueDataFunc(); | |
85 | + // }); | |
86 | + } catch (e) { | |
87 | + return e; | |
88 | + } | |
89 | + } else { | |
90 | + editPostId.value = data.record.id; | |
91 | + const editType = { | |
92 | + type: '', | |
93 | + configuration: {}, | |
94 | + name: '', | |
95 | + }; | |
96 | + if (data.record.type == 'org.thingsboard.rule.engine.kafka.TbKafkaNode') { | |
97 | + editType.type = 'KafKA'; | |
98 | + editType.configuration = data.record.configuration; | |
99 | + editType.name = data.record.name; | |
100 | + } else if (data.record.type == 'org.thingsboard.rule.engine.mqtt.TbMqttNode') { | |
101 | + editType.type = 'MQTT'; | |
102 | + editType.configuration = data.record.configuration; | |
103 | + editType.name = data.record.name; | |
104 | + } else if (data.record.type == 'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode') { | |
105 | + editType.type = 'RabbitMq'; | |
106 | + editType.configuration = data.record.configuration; | |
107 | + editType.name = data.record.name; | |
108 | + } else if (data.record.type == 'org.thingsboard.rule.engine.rest.TbRestApiCallNode') { | |
109 | + editType.type = 'Api'; | |
110 | + editType.configuration = data.record.configuration; | |
111 | + editType.name = data.record.name; | |
112 | + } | |
113 | + proxy.$refs.refTransferConfigMode.setStepOneFieldsValueFunc(editType); | |
114 | + proxy.$refs.refTransferConfigParams.editSonValueDataFunc(editType); | |
115 | + proxy.$refs.refTransferConfigParams.editSonValueDataFunc(editType); | |
116 | + proxy.$refs.refTransferConfigParams.editSonValueDataFunc(editType); | |
117 | + proxy.$refs.refTransferConfigParams.editSonValueDataFunc(editType); | |
118 | + } | |
47 | 119 | }); |
48 | - const handleNext = () => { | |
120 | + const handleNext = (args) => { | |
49 | 121 | current.value++; |
122 | + getModeSelectVal.value = args; | |
123 | + if (!unref(isUpdate)) return; | |
124 | + // try { | |
125 | + | |
126 | + // }); | |
127 | + // setTimeout(() => { | |
128 | + // proxy.$refs.refTransferConfigParams.clearSonValueDataFunc(); | |
129 | + // }, 100); | |
130 | + // } catch (e) { | |
131 | + // return e; | |
132 | + // } | |
50 | 133 | }; |
51 | 134 | const handlePrev = () => { |
52 | 135 | current.value--; |
53 | 136 | }; |
54 | - const handleSubmit = () => {}; | |
137 | + const addOrEditFunc = async () => { | |
138 | + getModeSonFormValue.value = await proxy.$refs.refTransferConfigMode.getSonValueFunc(); | |
139 | + getSonFormValue.value = await proxy.$refs.refTransferConfigParams.getSonValueDataFunc(); | |
140 | + if (getModeSonFormValue.value?.type == 'KafKA') { | |
141 | + getTypeObj.type = 'org.thingsboard.rule.engine.kafka.TbKafkaNode'; | |
142 | + getNameObj.name = getSonFormValue.value?.configuration?.name; | |
143 | + delete getSonFormValue.value?.configuration?.name; | |
144 | + } else if (getModeSonFormValue.value?.type == 'MQTT') { | |
145 | + getTypeObj.type = 'org.thingsboard.rule.engine.mqtt.TbMqttNode'; | |
146 | + getNameObj.name = getSonFormValue.value?.configuration?.name; | |
147 | + delete getSonFormValue.value?.configuration?.name; | |
148 | + } else if (getModeSonFormValue.value?.type == 'RabbitMq') { | |
149 | + getTypeObj.type = 'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode'; | |
150 | + getNameObj.name = getSonFormValue.value?.configuration?.name; | |
151 | + delete getSonFormValue.value?.configuration?.name; | |
152 | + } else if (getModeSonFormValue.value?.type == 'Api') { | |
153 | + getTypeObj.type = 'org.thingsboard.rule.engine.rest.TbRestApiCallNode'; | |
154 | + getNameObj.name = getSonFormValue.value?.configuration?.name; | |
155 | + delete getSonFormValue.value?.configuration?.name; | |
156 | + } | |
157 | + const id: any = { | |
158 | + id: unref(isUpdate) ? editPostId.value : '', | |
159 | + }; | |
160 | + Object.assign(allPostForm, getTypeObj, getSonFormValue.value, getNameObj, id); | |
161 | + if (!unref(isUpdate)) { | |
162 | + delete allPostForm.id; | |
163 | + } | |
164 | + }; | |
165 | + const handleSubmit = async () => { | |
166 | + if (!unref(isUpdate)) { | |
167 | + addOrEditFunc(); | |
168 | + await postAddConvertApi(allPostForm); | |
169 | + createMessage.success('数据转换新增成功'); | |
170 | + emit('success'); | |
171 | + closeModal(); | |
172 | + } else { | |
173 | + addOrEditFunc(); | |
174 | + await postAddConvertApi(allPostForm); | |
175 | + createMessage.success('数据转换编辑成功'); | |
176 | + emit('success'); | |
177 | + closeModal(); | |
178 | + } | |
179 | + }; | |
55 | 180 | return { |
56 | 181 | registerDrawer, |
57 | 182 | handleSubmit, |
... | ... | @@ -59,6 +184,9 @@ |
59 | 184 | current, |
60 | 185 | handleNext, |
61 | 186 | handlePrev, |
187 | + getModeSelectVal, | |
188 | + refTransferConfigParams, | |
189 | + refTransferConfigMode, | |
62 | 190 | }; |
63 | 191 | }, |
64 | 192 | }); | ... | ... |
... | ... | @@ -8,8 +8,17 @@ export const columns: BasicColumn[] = [ |
8 | 8 | }, |
9 | 9 | { |
10 | 10 | title: '途径', |
11 | - dataIndex: 'name1', | |
11 | + dataIndex: 'type', | |
12 | 12 | width: 200, |
13 | + format: (_text: string, record: Recordable) => { | |
14 | + return record.type === 'org.thingsboard.rule.engine.kafka.TbKafkaNode' | |
15 | + ? 'KafKA' | |
16 | + : record.type === 'org.thingsboard.rule.engine.mqtt.TbMqttNode' | |
17 | + ? 'MQTT' | |
18 | + : record.type === 'org.thingsboard.rule.engine.rabbitmq.TbRabbitMqNode' | |
19 | + ? 'RabbitMq' | |
20 | + : 'Api'; | |
21 | + }, | |
13 | 22 | }, |
14 | 23 | { |
15 | 24 | title: '状态', | ... | ... |
1 | 1 | import { FormSchema } from '/@/components/Form'; |
2 | 2 | |
3 | +export enum CredentialsEnum { | |
4 | + IS_ANONYMOUS = 'Anonymous', | |
5 | + IS_BASIC = 'Basic', | |
6 | + IS_PEM = 'PEM', | |
7 | +} | |
8 | + | |
9 | +export const isBasic = (type: string) => { | |
10 | + return type === CredentialsEnum.IS_BASIC; | |
11 | +}; | |
12 | +export const isPem = (type: string) => { | |
13 | + return type === CredentialsEnum.IS_PEM; | |
14 | +}; | |
15 | + | |
3 | 16 | export const modeForm: FormSchema[] = [ |
4 | 17 | { |
5 | - field: '', | |
6 | - label: '', | |
18 | + field: 'type', | |
19 | + label: '转换方式', | |
7 | 20 | component: 'Select', |
21 | + required: true, | |
8 | 22 | componentProps: { |
9 | 23 | placeholder: '请选择转换方式', |
10 | 24 | options: [ |
11 | 25 | { label: 'KafKA', value: 'KafKA' }, |
12 | 26 | { label: 'RabbitMq', value: 'RabbitMq' }, |
13 | - { label: 'Api调用', value: 'Api调用' }, | |
27 | + { label: 'Api调用', value: 'Api' }, | |
14 | 28 | { label: 'MQTT', value: 'MQTT' }, |
15 | 29 | ], |
16 | 30 | }, |
... | ... | @@ -18,11 +32,36 @@ export const modeForm: FormSchema[] = [ |
18 | 32 | }, |
19 | 33 | ]; |
20 | 34 | |
35 | +export const modeKafkaInseretKeyAndValueForm: FormSchema[] = [ | |
36 | + { | |
37 | + field: 'key', | |
38 | + label: 'Key', | |
39 | + colProps: { span: 12 }, | |
40 | + required: true, | |
41 | + component: 'Input', | |
42 | + componentProps: { | |
43 | + maxLength: 255, | |
44 | + placeholder: '请输入Key', | |
45 | + }, | |
46 | + }, | |
47 | + { | |
48 | + field: 'value', | |
49 | + label: 'Value', | |
50 | + colProps: { span: 12 }, | |
51 | + required: true, | |
52 | + component: 'Input', | |
53 | + componentProps: { | |
54 | + maxLength: 255, | |
55 | + placeholder: '请输入Value', | |
56 | + }, | |
57 | + }, | |
58 | +]; | |
59 | + | |
21 | 60 | export const modeKafkaForm: FormSchema[] = [ |
22 | 61 | { |
23 | - field: '', | |
62 | + field: 'name', | |
24 | 63 | label: '名称', |
25 | - colProps: { span: 13 }, | |
64 | + colProps: { span: 12 }, | |
26 | 65 | required: true, |
27 | 66 | component: 'Input', |
28 | 67 | componentProps: { |
... | ... | @@ -31,9 +70,9 @@ export const modeKafkaForm: FormSchema[] = [ |
31 | 70 | }, |
32 | 71 | }, |
33 | 72 | { |
34 | - field: '', | |
73 | + field: 'topicPattern', | |
35 | 74 | label: 'Topic', |
36 | - colProps: { span: 13 }, | |
75 | + colProps: { span: 12 }, | |
37 | 76 | required: true, |
38 | 77 | component: 'Input', |
39 | 78 | componentProps: { |
... | ... | @@ -42,60 +81,64 @@ export const modeKafkaForm: FormSchema[] = [ |
42 | 81 | }, |
43 | 82 | }, |
44 | 83 | { |
45 | - field: '', | |
84 | + field: 'bootstrapServers', | |
46 | 85 | label: 'Bootstrap', |
47 | - colProps: { span: 13 }, | |
86 | + colProps: { span: 12 }, | |
48 | 87 | component: 'Input', |
49 | 88 | componentProps: { |
50 | 89 | maxLength: 255, |
51 | - placeholder: '请输入Bootstrap servers', | |
90 | + placeholder: 'localhost', | |
52 | 91 | }, |
53 | 92 | }, |
54 | 93 | { |
55 | - field: '', | |
56 | - label: 'Automati', | |
57 | - colProps: { span: 13 }, | |
58 | - component: 'Input', | |
94 | + field: 'retries', | |
95 | + label: 'Retries', | |
96 | + colProps: { span: 12 }, | |
97 | + component: 'InputNumber', | |
98 | + defaultValue: 0, | |
59 | 99 | componentProps: { |
60 | 100 | maxLength: 255, |
61 | 101 | placeholder: '请输入Automatically retry times if fails', |
62 | 102 | }, |
63 | 103 | }, |
64 | 104 | { |
65 | - field: '', | |
66 | - label: 'Produces', | |
67 | - colProps: { span: 13 }, | |
68 | - component: 'Input', | |
105 | + field: 'batchSize', | |
106 | + label: 'BatchSize', | |
107 | + colProps: { span: 12 }, | |
108 | + component: 'InputNumber', | |
109 | + defaultValue: 16384, | |
69 | 110 | componentProps: { |
70 | 111 | maxLength: 255, |
71 | 112 | placeholder: '请输入Produces batch size in bytes', |
72 | 113 | }, |
73 | 114 | }, |
74 | 115 | { |
75 | - field: '', | |
76 | - label: 'Client', | |
77 | - colProps: { span: 13 }, | |
78 | - component: 'Input', | |
116 | + field: 'linger', | |
117 | + label: 'Linger', | |
118 | + colProps: { span: 12 }, | |
119 | + component: 'InputNumber', | |
120 | + defaultValue: 0, | |
79 | 121 | componentProps: { |
80 | 122 | maxLength: 255, |
81 | - placeholder: '请输入Client buffer max size in bytes', | |
123 | + placeholder: '请输入Time to buffer locally(ms)', | |
82 | 124 | }, |
83 | 125 | }, |
84 | 126 | { |
85 | - field: '', | |
86 | - label: 'Number', | |
87 | - colProps: { span: 13 }, | |
88 | - component: 'Input', | |
127 | + field: 'bufferMemory', | |
128 | + label: 'BufferMemory', | |
129 | + colProps: { span: 12 }, | |
130 | + component: 'InputNumber', | |
131 | + defaultValue: 33554432, | |
89 | 132 | componentProps: { |
90 | 133 | maxLength: 255, |
91 | - placeholder: '请输入Number of acknowledgments', | |
134 | + placeholder: '请输入Client buffer max size in bytes', | |
92 | 135 | }, |
93 | 136 | }, |
94 | 137 | { |
95 | - field: '', | |
138 | + field: 'acks', | |
96 | 139 | component: 'Select', |
97 | - label: 'Number', | |
98 | - colProps: { span: 13 }, | |
140 | + label: 'Acks', | |
141 | + colProps: { span: 12 }, | |
99 | 142 | componentProps: { |
100 | 143 | placeholder: '请选择Number of acknowledgments', |
101 | 144 | options: [ |
... | ... | @@ -107,38 +150,665 @@ export const modeKafkaForm: FormSchema[] = [ |
107 | 150 | }, |
108 | 151 | }, |
109 | 152 | { |
110 | - field: '', | |
153 | + field: 'keySerializer', | |
111 | 154 | label: 'Key', |
112 | - colProps: { span: 13 }, | |
155 | + colProps: { span: 12 }, | |
113 | 156 | required: true, |
114 | 157 | component: 'Input', |
158 | + defaultValue: 'org.apache.kafka.common.serialization.StringSerializer', | |
115 | 159 | componentProps: { |
116 | 160 | maxLength: 255, |
117 | - placeholder: '请输入Key serializer', | |
161 | + placeholder: 'org.apache.kafka.common.serialization.StringSerializer', | |
118 | 162 | }, |
119 | 163 | }, |
120 | 164 | { |
121 | - field: '', | |
165 | + field: 'valueSerializer', | |
122 | 166 | label: 'Value', |
123 | - colProps: { span: 13 }, | |
167 | + colProps: { span: 12 }, | |
124 | 168 | required: true, |
125 | 169 | component: 'Input', |
170 | + defaultValue: 'org.apache.kafka.common.serialization.StringSerializer', | |
126 | 171 | componentProps: { |
127 | 172 | maxLength: 255, |
128 | - placeholder: '请输入Value serializer', | |
173 | + placeholder: 'org.apache.kafka.common.serialization.StringSerializer', | |
129 | 174 | }, |
130 | 175 | }, |
131 | 176 | { |
132 | - field: '', | |
177 | + field: '1', | |
133 | 178 | label: '', |
134 | - colProps: { span: 13 }, | |
179 | + colProps: { span: 24 }, | |
180 | + slot: 'addValue', | |
181 | + component: 'Input', | |
182 | + }, | |
183 | + { | |
184 | + field: 'addMetadataKeyValuesAsKafkaHeaders', | |
185 | + label: '选择', | |
186 | + colProps: { span: 12 }, | |
135 | 187 | component: 'Checkbox', |
136 | - renderComponentContent: ' Add Message metadata key-value pairs to Kafka record headers ', | |
188 | + renderComponentContent: 'Add Message metadata key-value pairs to Kafka record headers', | |
137 | 189 | }, |
138 | 190 | { |
139 | - field: '', | |
191 | + field: 'kafkaHeadersCharset', | |
192 | + component: 'Select', | |
193 | + label: 'Charset', | |
194 | + required: true, | |
195 | + colProps: { span: 12 }, | |
196 | + componentProps: { | |
197 | + placeholder: '请选择Charset encoding', | |
198 | + options: [ | |
199 | + { label: 'US-ASCII', value: 'US' }, | |
200 | + { label: 'ISO-8859-1', value: 'ISO-8859-1' }, | |
201 | + { label: 'UTF-8', value: 'UTF-8' }, | |
202 | + { label: 'UTF-16BE', value: 'UTF-16BE' }, | |
203 | + { label: 'UTF-16LE', value: 'UTF-16LE' }, | |
204 | + { label: 'UTF-16', value: 'UTF-16' }, | |
205 | + ], | |
206 | + }, | |
207 | + show: ({ values }) => { | |
208 | + return !!values.addMetadataKeyValuesAsKafkaHeaders; | |
209 | + }, | |
210 | + }, | |
211 | + | |
212 | + { | |
213 | + field: 'description', | |
140 | 214 | label: '说明', |
141 | - colProps: { span: 13 }, | |
215 | + colProps: { span: 12 }, | |
216 | + component: 'Input', | |
217 | + componentProps: { | |
218 | + maxLength: 255, | |
219 | + placeholder: '请输入说明', | |
220 | + }, | |
221 | + }, | |
222 | +]; | |
223 | + | |
224 | +export const modeMqttForm: FormSchema[] = [ | |
225 | + { | |
226 | + field: 'name', | |
227 | + label: '名称', | |
228 | + colProps: { span: 12 }, | |
229 | + required: true, | |
230 | + component: 'Input', | |
231 | + componentProps: { | |
232 | + maxLength: 255, | |
233 | + placeholder: '请输入名称', | |
234 | + }, | |
235 | + }, | |
236 | + { | |
237 | + field: 'topicPattern', | |
238 | + label: 'Topic', | |
239 | + colProps: { span: 12 }, | |
240 | + required: true, | |
241 | + component: 'Input', | |
242 | + componentProps: { | |
243 | + maxLength: 255, | |
244 | + placeholder: '请输入Topic pattern', | |
245 | + }, | |
246 | + }, | |
247 | + { | |
248 | + field: 'host', | |
249 | + label: 'Host', | |
250 | + colProps: { span: 12 }, | |
251 | + component: 'Input', | |
252 | + required: true, | |
253 | + componentProps: { | |
254 | + maxLength: 255, | |
255 | + placeholder: '请输入Host', | |
256 | + }, | |
257 | + }, | |
258 | + { | |
259 | + field: 'port', | |
260 | + label: 'Port', | |
261 | + colProps: { span: 12 }, | |
262 | + component: 'Input', | |
263 | + required: true, | |
264 | + componentProps: { | |
265 | + maxLength: 255, | |
266 | + placeholder: '请输入Port', | |
267 | + }, | |
268 | + }, | |
269 | + { | |
270 | + field: 'connectTimeoutSec', | |
271 | + label: 'Connection', | |
272 | + colProps: { span: 12 }, | |
273 | + component: 'Input', | |
274 | + required: true, | |
275 | + componentProps: { | |
276 | + maxLength: 255, | |
277 | + placeholder: '请输入Connection timeout (sec)', | |
278 | + }, | |
279 | + }, | |
280 | + { | |
281 | + field: 'clientId', | |
282 | + label: 'Client ID', | |
283 | + colProps: { span: 12 }, | |
284 | + component: 'Input', | |
285 | + componentProps: { | |
286 | + maxLength: 255, | |
287 | + placeholder: '请输入Client ID', | |
288 | + }, | |
289 | + }, | |
290 | + { | |
291 | + field: 'cleanSession', | |
292 | + label: 'Clean', | |
293 | + colProps: { span: 12 }, | |
294 | + component: 'Checkbox', | |
295 | + renderComponentContent: 'Clean session', | |
296 | + }, | |
297 | + { | |
298 | + field: 'ssl', | |
299 | + label: 'Enable', | |
300 | + colProps: { span: 12 }, | |
301 | + component: 'Checkbox', | |
302 | + renderComponentContent: 'Enable SSL', | |
303 | + }, | |
304 | + { | |
305 | + field: 'type', | |
306 | + component: 'Select', | |
307 | + label: 'type', | |
308 | + colProps: { span: 12 }, | |
309 | + componentProps: { | |
310 | + placeholder: '请选择Credentials', | |
311 | + options: [ | |
312 | + { label: 'Anonymous', value: 'Anonymous' }, | |
313 | + { label: 'Basic', value: 'Basic' }, | |
314 | + { label: 'PEM', value: 'PEM' }, | |
315 | + ], | |
316 | + }, | |
317 | + }, | |
318 | + { | |
319 | + field: 'username', | |
320 | + label: 'Username', | |
321 | + colProps: { span: 12 }, | |
322 | + component: 'Input', | |
323 | + required: true, | |
324 | + componentProps: { | |
325 | + maxLength: 255, | |
326 | + placeholder: '请输入Username', | |
327 | + }, | |
328 | + ifShow: ({ values }) => isBasic(Reflect.get(values, 'type')), | |
329 | + }, | |
330 | + { | |
331 | + field: 'password', | |
332 | + label: 'Password', | |
333 | + colProps: { span: 12 }, | |
334 | + component: 'Input', | |
335 | + componentProps: { | |
336 | + maxLength: 255, | |
337 | + placeholder: '请输入Password', | |
338 | + }, | |
339 | + ifShow: ({ values }) => isBasic(Reflect.get(values, 'type')), | |
340 | + }, | |
341 | + { | |
342 | + field: '4', | |
343 | + label: '', | |
344 | + colProps: { span: 24 }, | |
345 | + component: 'Input', | |
346 | + slot: 'uploadAdd1', | |
347 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
348 | + }, | |
349 | + { | |
350 | + field: '5', | |
351 | + label: '', | |
352 | + colProps: { span: 24 }, | |
353 | + component: 'Input', | |
354 | + slot: 'uploadAdd2', | |
355 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
356 | + }, | |
357 | + { | |
358 | + field: '6', | |
359 | + label: '', | |
360 | + colProps: { span: 24 }, | |
361 | + component: 'Input', | |
362 | + slot: 'uploadAdd3', | |
363 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
364 | + }, | |
365 | + { | |
366 | + field: 'password', | |
367 | + label: 'Password', | |
368 | + colProps: { span: 12 }, | |
369 | + component: 'Input', | |
370 | + componentProps: { | |
371 | + maxLength: 255, | |
372 | + placeholder: '请输入Password', | |
373 | + }, | |
374 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
375 | + }, | |
376 | + { | |
377 | + field: 'description', | |
378 | + label: '说明', | |
379 | + colProps: { span: 12 }, | |
380 | + component: 'Input', | |
381 | + componentProps: { | |
382 | + maxLength: 255, | |
383 | + placeholder: '请输入说明', | |
384 | + }, | |
385 | + }, | |
386 | +]; | |
387 | + | |
388 | +export const modeRabbitMqForm: FormSchema[] = [ | |
389 | + { | |
390 | + field: 'name', | |
391 | + label: '名称', | |
392 | + colProps: { span: 12 }, | |
393 | + required: true, | |
394 | + component: 'Input', | |
395 | + componentProps: { | |
396 | + maxLength: 255, | |
397 | + placeholder: '请输入名称', | |
398 | + }, | |
399 | + }, | |
400 | + { | |
401 | + field: 'exchangeNamePattern', | |
402 | + label: 'Exchange', | |
403 | + colProps: { span: 12 }, | |
404 | + component: 'Input', | |
405 | + componentProps: { | |
406 | + maxLength: 255, | |
407 | + placeholder: '请输入Exchange name pattern', | |
408 | + }, | |
409 | + }, | |
410 | + { | |
411 | + field: 'routingKeyPattern', | |
412 | + label: 'Routing', | |
413 | + colProps: { span: 12 }, | |
414 | + component: 'Input', | |
415 | + componentProps: { | |
416 | + maxLength: 255, | |
417 | + placeholder: '请输入Routing key pattern', | |
418 | + }, | |
419 | + }, | |
420 | + { | |
421 | + field: 'messageProperties', | |
422 | + component: 'Select', | |
423 | + label: 'Message', | |
424 | + colProps: { span: 12 }, | |
425 | + componentProps: { | |
426 | + placeholder: '请选择Message properties', | |
427 | + options: [ | |
428 | + { label: 'BASIC', value: 'BASIC' }, | |
429 | + { label: 'TEXT_PLAIN', value: 'TEXT_PLAIN' }, | |
430 | + { label: 'MINIMAL_BASIC', value: 'MINIMAL_BASIC' }, | |
431 | + { label: 'MINIMAL_PERSISTENT_BASIC', value: 'MINIMAL_PERSISTENT_BASIC' }, | |
432 | + { label: 'PERSISTENT_BASIC', value: 'PERSISTENT_BASIC' }, | |
433 | + { label: 'PERSISTENT_TEXT_PLAIN', value: 'PERSISTENT_TEXT_PLAIN' }, | |
434 | + ], | |
435 | + }, | |
436 | + }, | |
437 | + { | |
438 | + field: 'host', | |
439 | + label: 'Host', | |
440 | + colProps: { span: 12 }, | |
441 | + component: 'Input', | |
442 | + required: true, | |
443 | + componentProps: { | |
444 | + maxLength: 255, | |
445 | + placeholder: 'localhost', | |
446 | + }, | |
447 | + }, | |
448 | + { | |
449 | + field: 'port', | |
450 | + label: 'Port', | |
451 | + colProps: { span: 12 }, | |
452 | + component: 'Input', | |
453 | + required: true, | |
454 | + componentProps: { | |
455 | + maxLength: 255, | |
456 | + placeholder: '请输入Port', | |
457 | + }, | |
458 | + }, | |
459 | + { | |
460 | + field: 'virtualHost', | |
461 | + label: 'Virtual', | |
462 | + colProps: { span: 12 }, | |
463 | + component: 'Input', | |
464 | + componentProps: { | |
465 | + maxLength: 255, | |
466 | + placeholder: '/', | |
467 | + }, | |
468 | + }, | |
469 | + { | |
470 | + field: 'username', | |
471 | + label: 'Username', | |
472 | + colProps: { span: 12 }, | |
473 | + component: 'Input', | |
474 | + componentProps: { | |
475 | + maxLength: 255, | |
476 | + placeholder: '请输入Username', | |
477 | + }, | |
478 | + }, | |
479 | + { | |
480 | + field: 'password', | |
481 | + label: 'Password', | |
482 | + colProps: { span: 12 }, | |
483 | + component: 'Input', | |
484 | + componentProps: { | |
485 | + maxLength: 255, | |
486 | + placeholder: '请输入Password', | |
487 | + }, | |
488 | + }, | |
489 | + { | |
490 | + field: 'automaticRecoveryEnabled', | |
491 | + label: ' Automatic', | |
492 | + colProps: { span: 12 }, | |
493 | + component: 'Checkbox', | |
494 | + renderComponentContent: 'Automatic recovery', | |
495 | + }, | |
496 | + { | |
497 | + field: 'connectionTimeout', | |
498 | + label: 'Connection', | |
499 | + colProps: { span: 12 }, | |
500 | + component: 'Input', | |
501 | + componentProps: { | |
502 | + maxLength: 255, | |
503 | + placeholder: '请输入Connection timeout (ms)', | |
504 | + }, | |
505 | + }, | |
506 | + { | |
507 | + field: 'handshakeTimeout', | |
508 | + label: 'Handshake', | |
509 | + colProps: { span: 12 }, | |
510 | + component: 'Input', | |
511 | + componentProps: { | |
512 | + maxLength: 255, | |
513 | + placeholder: '请输入Handshake timeout (ms)', | |
514 | + }, | |
515 | + }, | |
516 | + { | |
517 | + field: '1', | |
518 | + label: '', | |
519 | + colProps: { span: 24 }, | |
520 | + component: 'Input', | |
521 | + slot: 'addKeyAndValue', | |
522 | + }, | |
523 | + | |
524 | + { | |
525 | + field: 'description', | |
526 | + label: '说明', | |
527 | + colProps: { span: 12 }, | |
528 | + component: 'Input', | |
529 | + componentProps: { | |
530 | + maxLength: 255, | |
531 | + placeholder: '请输入说明', | |
532 | + }, | |
533 | + }, | |
534 | +]; | |
535 | + | |
536 | +export const modeApiForm: FormSchema[] = [ | |
537 | + { | |
538 | + field: 'name', | |
539 | + label: '名称', | |
540 | + colProps: { span: 12 }, | |
541 | + required: true, | |
542 | + component: 'Input', | |
543 | + componentProps: { | |
544 | + maxLength: 255, | |
545 | + placeholder: '请输入名称', | |
546 | + }, | |
547 | + }, | |
548 | + { | |
549 | + field: 'restEndpointUrlPattern', | |
550 | + label: 'Endpoint', | |
551 | + colProps: { span: 12 }, | |
552 | + required: true, | |
553 | + component: 'Input', | |
554 | + componentProps: { | |
555 | + maxLength: 255, | |
556 | + placeholder: '请输入Endpoint URL pattern', | |
557 | + }, | |
558 | + }, | |
559 | + { | |
560 | + field: 'requestMethod', | |
561 | + component: 'Select', | |
562 | + label: 'Request', | |
563 | + colProps: { span: 12 }, | |
564 | + componentProps: { | |
565 | + placeholder: '请选择Request method', | |
566 | + options: [ | |
567 | + { label: 'GET', value: 'GET' }, | |
568 | + { label: 'POST', value: 'POST' }, | |
569 | + { label: 'PUT', value: 'PUT' }, | |
570 | + { label: 'DELETE', value: 'DELETE' }, | |
571 | + ], | |
572 | + }, | |
573 | + }, | |
574 | + { | |
575 | + field: 'enableProxy', | |
576 | + label: '选择', | |
577 | + colProps: { span: 12 }, | |
578 | + component: 'Checkbox', | |
579 | + renderComponentContent: 'Enable proxy', | |
580 | + }, | |
581 | + | |
582 | + { | |
583 | + field: 'proxyHost', | |
584 | + label: 'Host', | |
585 | + colProps: { span: 12 }, | |
586 | + required: true, | |
587 | + component: 'Input', | |
588 | + componentProps: { | |
589 | + maxLength: 255, | |
590 | + placeholder: 'http或者https开头', | |
591 | + }, | |
592 | + show: ({ values }) => { | |
593 | + return !!values.enableProxy; | |
594 | + }, | |
595 | + }, | |
596 | + { | |
597 | + field: 'proxyPort', | |
598 | + label: 'Port', | |
599 | + colProps: { span: 12 }, | |
600 | + required: true, | |
601 | + component: 'Input', | |
602 | + componentProps: { | |
603 | + maxLength: 255, | |
604 | + placeholder: 'http或者https开头', | |
605 | + }, | |
606 | + show: ({ values }) => { | |
607 | + return !!values.enableProxy; | |
608 | + }, | |
609 | + }, | |
610 | + { | |
611 | + field: 'proxyUser', | |
612 | + label: 'User', | |
613 | + colProps: { span: 12 }, | |
614 | + required: true, | |
615 | + component: 'Input', | |
616 | + componentProps: { | |
617 | + maxLength: 255, | |
618 | + placeholder: '请输入Proxy user', | |
619 | + }, | |
620 | + show: ({ values }) => { | |
621 | + return !!values.enableProxy; | |
622 | + }, | |
623 | + }, | |
624 | + { | |
625 | + field: 'proxyPassword', | |
626 | + label: 'Password', | |
627 | + colProps: { span: 12 }, | |
628 | + required: true, | |
629 | + component: 'Input', | |
630 | + componentProps: { | |
631 | + maxLength: 255, | |
632 | + placeholder: '请输入Proxy password', | |
633 | + }, | |
634 | + show: ({ values }) => { | |
635 | + return !!values.enableProxy; | |
636 | + }, | |
637 | + }, | |
638 | + | |
639 | + { | |
640 | + field: 'useSystemProxyProperties', | |
641 | + label: '选择', | |
642 | + colProps: { span: 12 }, | |
643 | + component: 'Checkbox', | |
644 | + renderComponentContent: 'Use system proxy properties', | |
645 | + }, | |
646 | + { | |
647 | + field: 'maxParallelRequestsCount', | |
648 | + label: 'Max', | |
649 | + colProps: { span: 12 }, | |
650 | + required: true, | |
651 | + component: 'Input', | |
652 | + componentProps: { | |
653 | + maxLength: 255, | |
654 | + placeholder: '请输入Max number of paraller requests', | |
655 | + }, | |
656 | + show: ({ values }) => { | |
657 | + return !!values.useSystemProxyProperties; | |
658 | + }, | |
659 | + }, | |
660 | + { | |
661 | + field: 'ignoreRequestBody', | |
662 | + label: '选择', | |
663 | + colProps: { span: 12 }, | |
664 | + component: 'Checkbox', | |
665 | + renderComponentContent: 'Without request body', | |
666 | + }, | |
667 | + { | |
668 | + field: 'readTimeoutMs', | |
669 | + label: 'Read', | |
670 | + colProps: { span: 12 }, | |
671 | + required: true, | |
672 | + component: 'Input', | |
673 | + componentProps: { | |
674 | + maxLength: 255, | |
675 | + placeholder: '请输入Read timeout in times', | |
676 | + }, | |
677 | + show: ({ values }) => { | |
678 | + return !values.useSystemProxyProperties; | |
679 | + }, | |
680 | + }, | |
681 | + { | |
682 | + field: 'maxParallelRequestsCount', | |
683 | + label: 'Max', | |
684 | + colProps: { span: 12 }, | |
685 | + required: true, | |
686 | + component: 'Input', | |
687 | + componentProps: { | |
688 | + maxLength: 255, | |
689 | + placeholder: '请输入Max number of paraller requests', | |
690 | + }, | |
691 | + show: ({ values }) => { | |
692 | + return !values.useSystemProxyProperties; | |
693 | + }, | |
694 | + }, | |
695 | + { | |
696 | + field: '1', | |
697 | + label: '', | |
698 | + colProps: { span: 24 }, | |
699 | + component: 'Input', | |
700 | + slot: 'addKeyAndValue', | |
701 | + }, | |
702 | + | |
703 | + { | |
704 | + field: 'useRedisQueueForMsgPersistence', | |
705 | + label: '选择', | |
706 | + colProps: { span: 12 }, | |
707 | + component: 'Checkbox', | |
708 | + renderComponentContent: 'Use redis queue for message persistence', | |
709 | + }, | |
710 | + { | |
711 | + field: 'trimQueue', | |
712 | + label: '选择', | |
713 | + colProps: { span: 12 }, | |
714 | + component: 'Checkbox', | |
715 | + renderComponentContent: 'Trim redis queue', | |
716 | + show: ({ values }) => { | |
717 | + return !!values.useRedisQueueForMsgPersistence; | |
718 | + }, | |
719 | + }, | |
720 | + { | |
721 | + field: 'maxQueueSize', | |
722 | + label: 'Redis', | |
723 | + colProps: { span: 12 }, | |
724 | + required: true, | |
725 | + component: 'Input', | |
726 | + componentProps: { | |
727 | + maxLength: 255, | |
728 | + placeholder: '请输入Redis queue max size', | |
729 | + }, | |
730 | + show: ({ values }) => { | |
731 | + return !!values.useRedisQueueForMsgPersistence; | |
732 | + }, | |
733 | + }, | |
734 | + | |
735 | + { | |
736 | + field: 'type', | |
737 | + component: 'Select', | |
738 | + label: 'type', | |
739 | + colProps: { span: 12 }, | |
740 | + componentProps: { | |
741 | + placeholder: '请选择Number of acknowledgments', | |
742 | + options: [ | |
743 | + { label: 'Anonymous', value: 'Anonymous' }, | |
744 | + { label: 'Basic', value: 'Basic' }, | |
745 | + { label: 'PEM', value: 'PEM' }, | |
746 | + ], | |
747 | + }, | |
748 | + }, | |
749 | + { | |
750 | + field: 'username', | |
751 | + label: 'Username', | |
752 | + colProps: { span: 12 }, | |
753 | + component: 'Input', | |
754 | + required: true, | |
755 | + componentProps: { | |
756 | + maxLength: 255, | |
757 | + placeholder: '请输入Username', | |
758 | + }, | |
759 | + ifShow: ({ values }) => isBasic(Reflect.get(values, 'type')), | |
760 | + }, | |
761 | + { | |
762 | + field: 'password', | |
763 | + label: 'Password', | |
764 | + colProps: { span: 12 }, | |
765 | + component: 'Input', | |
766 | + componentProps: { | |
767 | + maxLength: 255, | |
768 | + placeholder: '请输入Password', | |
769 | + }, | |
770 | + ifShow: ({ values }) => isBasic(Reflect.get(values, 'type')), | |
771 | + }, | |
772 | + { | |
773 | + field: '1', | |
774 | + label: '', | |
775 | + colProps: { span: 24 }, | |
776 | + component: 'Input', | |
777 | + slot: 'uploadAdd1', | |
778 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
779 | + }, | |
780 | + { | |
781 | + field: '1', | |
782 | + label: '', | |
783 | + colProps: { span: 24 }, | |
784 | + component: 'Input', | |
785 | + slot: 'uploadAdd2', | |
786 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
787 | + }, | |
788 | + { | |
789 | + field: '1', | |
790 | + label: '', | |
791 | + colProps: { span: 24 }, | |
792 | + component: 'Input', | |
793 | + slot: 'uploadAdd3', | |
794 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
795 | + }, | |
796 | + { | |
797 | + field: 'password', | |
798 | + label: 'Password', | |
799 | + colProps: { span: 12 }, | |
800 | + component: 'Input', | |
801 | + componentProps: { | |
802 | + maxLength: 255, | |
803 | + placeholder: '请输入Password', | |
804 | + }, | |
805 | + ifShow: ({ values }) => isPem(Reflect.get(values, 'type')), | |
806 | + }, | |
807 | + | |
808 | + { | |
809 | + field: 'description', | |
810 | + label: '说明', | |
811 | + colProps: { span: 12 }, | |
142 | 812 | component: 'Input', |
143 | 813 | componentProps: { |
144 | 814 | maxLength: 255, | ... | ... |
1 | 1 | <template> |
2 | - <div class="step2"> <BasicForm :showSubmitButton="false" @register="register" /> </div> | |
2 | + <div class="root"> | |
3 | + <div class="root-form"> | |
4 | + <BasicForm :showSubmitButton="false" @register="register"> | |
5 | + <template #addKeyAndValue="{ field }"> | |
6 | + <span style="display: none">{{ field }}</span> | |
7 | + <div> | |
8 | + <div> | |
9 | + <template v-for="(item, index) in keyAndValueArr" :key="index"> | |
10 | + <span style="display: none">{{ item + index }}</span> | |
11 | + <BasicForm | |
12 | + :showResetButton="false" | |
13 | + :showSubmitButton="false" | |
14 | + @register="registerKeyAndValue" | |
15 | + /> | |
16 | + </template> | |
17 | + <div | |
18 | + style=" | |
19 | + width: 5vw; | |
20 | + height: 3vh; | |
21 | + display: flex; | |
22 | + flex-direction: row; | |
23 | + justify-content: center; | |
24 | + align-items: center; | |
25 | + margin-left: 1.8vw; | |
26 | + " | |
27 | + > | |
28 | + <div | |
29 | + style=" | |
30 | + width: 2.6vw; | |
31 | + height: 3vh; | |
32 | + background-color: #0960bd; | |
33 | + border-radius: 10px; | |
34 | + cursor: pointer; | |
35 | + text-align: center; | |
36 | + line-height: 2.89vh; | |
37 | + " | |
38 | + > | |
39 | + <span @click="addKeyAndValueFunc" style="color: white">添加</span> | |
40 | + </div> | |
41 | + <div | |
42 | + style=" | |
43 | + width: 2.6vw; | |
44 | + height: 3vh; | |
45 | + margin-left: 1vw; | |
46 | + background-color: #ed6f6f; | |
47 | + border-radius: 10px; | |
48 | + cursor: pointer; | |
49 | + text-align: center; | |
50 | + line-height: 2.89vh; | |
51 | + " | |
52 | + > | |
53 | + <span @click="removeKeyAndValueFunc" style="color: white">删除</span> | |
54 | + </div> | |
55 | + </div> | |
56 | + <div> </div> | |
57 | + </div> | |
58 | + </div> | |
59 | + </template> | |
60 | + <template #uploadAdd1="{ field }"> | |
61 | + <span style="display: none">{{ field }}</span> | |
62 | + <UploadDragger | |
63 | + v-model:fileList="fileList" | |
64 | + name="file" | |
65 | + :multiple="true" | |
66 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
67 | + @change="handleChange" | |
68 | + > | |
69 | + <p class="ant-upload-drag-icon"> | |
70 | + <InboxOutlined /> | |
71 | + </p> | |
72 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
73 | + <p class="ant-upload-hint"> | |
74 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
75 | + other band files | |
76 | + </p> | |
77 | + </UploadDragger> | |
78 | + </template> | |
79 | + <template #uploadAdd2="{ field }"> | |
80 | + <span style="display: none">{{ field }}</span> | |
81 | + <UploadDragger | |
82 | + v-model:fileList="fileList" | |
83 | + name="file" | |
84 | + :multiple="true" | |
85 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
86 | + @change="handleChange" | |
87 | + > | |
88 | + <p class="ant-upload-drag-icon"> | |
89 | + <InboxOutlined /> | |
90 | + </p> | |
91 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
92 | + <p class="ant-upload-hint"> | |
93 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
94 | + other band files | |
95 | + </p> | |
96 | + </UploadDragger> | |
97 | + </template> | |
98 | + <template #uploadAdd3="{ field }"> | |
99 | + <span style="display: none">{{ field }}</span> | |
100 | + <UploadDragger | |
101 | + v-model:fileList="fileList" | |
102 | + name="file" | |
103 | + :multiple="true" | |
104 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
105 | + @change="handleChange" | |
106 | + > | |
107 | + <p class="ant-upload-drag-icon"> | |
108 | + <InboxOutlined /> | |
109 | + </p> | |
110 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
111 | + <p class="ant-upload-hint"> | |
112 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
113 | + other band files | |
114 | + </p> | |
115 | + </UploadDragger> | |
116 | + </template> | |
117 | + </BasicForm> | |
118 | + </div> | |
119 | + </div> | |
3 | 120 | </template> |
4 | 121 | <script lang="ts"> |
5 | - import { defineComponent } from 'vue'; | |
122 | + import { defineComponent, ref, reactive } from 'vue'; | |
6 | 123 | import { BasicForm, useForm } from '/@/components/Form'; |
7 | - import { modeKafkaForm } from './config'; | |
8 | - | |
9 | - import { Alert, Divider, Descriptions } from 'ant-design-vue'; | |
124 | + import { modeApiForm, modeKafkaInseretKeyAndValueForm } from '../config'; | |
125 | + import { InboxOutlined } from '@ant-design/icons-vue'; | |
126 | + import { Alert, Divider, Descriptions, UploadDragger } from 'ant-design-vue'; | |
10 | 127 | |
11 | 128 | export default defineComponent({ |
12 | 129 | components: { |
... | ... | @@ -15,12 +132,19 @@ |
15 | 132 | [Divider.name]: Divider, |
16 | 133 | [Descriptions.name]: Descriptions, |
17 | 134 | [Descriptions.Item.name]: Descriptions.Item, |
135 | + InboxOutlined, | |
136 | + UploadDragger, | |
18 | 137 | }, |
19 | 138 | emits: ['next', 'prev', 'register'], |
20 | 139 | setup(_, { emit }) { |
140 | + const fileList = ref<[]>([]); | |
141 | + const keyAndValueArr = ref<[]>([]); | |
142 | + const sonValues = reactive({ | |
143 | + configuration: {}, | |
144 | + }); | |
21 | 145 | const [register, { validate, setFieldsValue, resetFields }] = useForm({ |
22 | 146 | labelWidth: 80, |
23 | - schemas: modeKafkaForm, | |
147 | + schemas: modeApiForm, | |
24 | 148 | actionColOptions: { |
25 | 149 | span: 14, |
26 | 150 | }, |
... | ... | @@ -31,6 +155,14 @@ |
31 | 155 | resetFunc: customResetFunc, |
32 | 156 | submitFunc: customSubmitFunc, |
33 | 157 | }); |
158 | + | |
159 | + const [registerKeyAndValue] = useForm({ | |
160 | + labelWidth: 80, | |
161 | + schemas: modeKafkaInseretKeyAndValueForm, | |
162 | + actionColOptions: { | |
163 | + span: 14, | |
164 | + }, | |
165 | + }); | |
34 | 166 | const setStepTwoFieldsValueFunc = (v) => { |
35 | 167 | setFieldsValue(v); |
36 | 168 | }; |
... | ... | @@ -48,11 +180,60 @@ |
48 | 180 | } finally { |
49 | 181 | } |
50 | 182 | } |
51 | - return { register, setStepTwoFieldsValueFunc, customClearStepTwoValueFunc }; | |
183 | + const defaultAddKeyAndValueFunc = () => { | |
184 | + if (keyAndValueArr.value.length == 0) { | |
185 | + keyAndValueArr.value.push({ | |
186 | + key: 1, | |
187 | + value: 1, | |
188 | + }); | |
189 | + } | |
190 | + }; | |
191 | + defaultAddKeyAndValueFunc(); | |
192 | + | |
193 | + const addKeyAndValueFunc = () => { | |
194 | + keyAndValueArr.value.push({ | |
195 | + key: 1, | |
196 | + value: 1, | |
197 | + }); | |
198 | + }; | |
199 | + const removeKeyAndValueFunc = () => { | |
200 | + keyAndValueArr.value.splice(0, 1); | |
201 | + }; | |
202 | + const handleChange = () => {}; | |
203 | + | |
204 | + const getSonValueFunc = async () => { | |
205 | + sonValues.configuration = await validate(); | |
206 | + return sonValues; | |
207 | + }; | |
208 | + return { | |
209 | + register, | |
210 | + setStepTwoFieldsValueFunc, | |
211 | + customClearStepTwoValueFunc, | |
212 | + addKeyAndValueFunc, | |
213 | + removeKeyAndValueFunc, | |
214 | + getSonValueFunc, | |
215 | + keyAndValueArr, | |
216 | + registerKeyAndValue, | |
217 | + fileList, | |
218 | + handleChange, | |
219 | + }; | |
52 | 220 | }, |
53 | 221 | }); |
54 | 222 | </script> |
55 | 223 | <style lang="less" scoped> |
56 | - .step2 { | |
224 | + .root { | |
225 | + width: 45.55vw; | |
226 | + border: 1px solid #bfbfbf; | |
227 | + display: flex; | |
228 | + margin-top: 1vh; | |
229 | + .root-form { | |
230 | + width: 44vw; | |
231 | + margin: 1vh 1vw; | |
232 | + position: relative; | |
233 | + :deep .ant-btn { | |
234 | + position: absolute; | |
235 | + right: 1vw; | |
236 | + } | |
237 | + } | |
57 | 238 | } |
58 | 239 | </style> | ... | ... |
1 | 1 | <template> |
2 | - <div class="step2"> <BasicForm :showSubmitButton="false" @register="register" /> </div> | |
2 | + <div class="root"> | |
3 | + <div class="root-form"> | |
4 | + <BasicForm :showResetButton="false" :showSubmitButton="false" @register="register"> | |
5 | + <template #addValue="{ field }"> | |
6 | + <span style="display: none">{{ field }}</span> | |
7 | + <div> | |
8 | + <div> | |
9 | + <template v-for="(item, index) in keyAndValueArr" :key="index"> | |
10 | + <span style="display: none">{{ item + index }}</span> | |
11 | + <BasicForm | |
12 | + :showResetButton="false" | |
13 | + :showSubmitButton="false" | |
14 | + @register="registerKeyAndValue" | |
15 | + /> | |
16 | + </template> | |
17 | + <div | |
18 | + style=" | |
19 | + width: 5vw; | |
20 | + height: 3vh; | |
21 | + display: flex; | |
22 | + flex-direction: row; | |
23 | + justify-content: center; | |
24 | + align-items: center; | |
25 | + margin-left: 1.8vw; | |
26 | + " | |
27 | + > | |
28 | + <div | |
29 | + style=" | |
30 | + width: 2.6vw; | |
31 | + height: 3vh; | |
32 | + background-color: #0960bd; | |
33 | + border-radius: 10px; | |
34 | + cursor: pointer; | |
35 | + text-align: center; | |
36 | + line-height: 2.89vh; | |
37 | + " | |
38 | + > | |
39 | + <span @click="addKeyAndValueFunc" style="color: white">添加</span> | |
40 | + </div> | |
41 | + <div | |
42 | + style=" | |
43 | + width: 2.6vw; | |
44 | + height: 3vh; | |
45 | + margin-left: 1vw; | |
46 | + background-color: #ed6f6f; | |
47 | + border-radius: 10px; | |
48 | + cursor: pointer; | |
49 | + text-align: center; | |
50 | + line-height: 2.89vh; | |
51 | + " | |
52 | + > | |
53 | + <span @click="removeKeyAndValueFunc" style="color: white">删除</span> | |
54 | + </div> | |
55 | + </div> | |
56 | + <div> </div> | |
57 | + </div> | |
58 | + </div> | |
59 | + </template> | |
60 | + </BasicForm> | |
61 | + <div | |
62 | + style=" | |
63 | + width: 2.6vw; | |
64 | + height: 3vh; | |
65 | + margin-left: 19vw; | |
66 | + margin-top: 2vh; | |
67 | + background-color: #0960bd; | |
68 | + border-radius: 10px; | |
69 | + cursor: pointer; | |
70 | + text-align: center; | |
71 | + line-height: 2.89vh; | |
72 | + " | |
73 | + > | |
74 | + <span @click="customResetFunc" style="color: white">上一步</span> | |
75 | + </div> | |
76 | + </div> | |
77 | + </div> | |
3 | 78 | </template> |
4 | 79 | <script lang="ts"> |
5 | - import { defineComponent } from 'vue'; | |
80 | + import { defineComponent, ref, reactive } from 'vue'; | |
6 | 81 | import { BasicForm, useForm } from '/@/components/Form'; |
7 | - import { modeKafkaForm } from './config'; | |
8 | - | |
82 | + import { modeKafkaForm, modeKafkaInseretKeyAndValueForm } from '../config'; | |
9 | 83 | import { Alert, Divider, Descriptions } from 'ant-design-vue'; |
10 | 84 | |
11 | 85 | export default defineComponent({ |
... | ... | @@ -18,7 +92,11 @@ |
18 | 92 | }, |
19 | 93 | emits: ['next', 'prev', 'register'], |
20 | 94 | setup(_, { emit }) { |
21 | - const [register, { validate, setFieldsValue, resetFields }] = useForm({ | |
95 | + const keyAndValueArr = ref<[]>([]); | |
96 | + const sonValues = reactive({ | |
97 | + configuration: {}, | |
98 | + }); | |
99 | + const [register, { validateFields, setFieldsValue, resetFields }] = useForm({ | |
22 | 100 | labelWidth: 80, |
23 | 101 | schemas: modeKafkaForm, |
24 | 102 | actionColOptions: { |
... | ... | @@ -31,8 +109,21 @@ |
31 | 109 | resetFunc: customResetFunc, |
32 | 110 | submitFunc: customSubmitFunc, |
33 | 111 | }); |
34 | - const setStepTwoFieldsValueFunc = (v) => { | |
112 | + | |
113 | + const [registerKeyAndValue] = useForm({ | |
114 | + labelWidth: 80, | |
115 | + schemas: modeKafkaInseretKeyAndValueForm, | |
116 | + actionColOptions: { | |
117 | + span: 14, | |
118 | + }, | |
119 | + }); | |
120 | + | |
121 | + const setStepTwoFieldsValueFunc = (v, v1) => { | |
122 | + console.log(v); | |
35 | 123 | setFieldsValue(v); |
124 | + setFieldsValue({ | |
125 | + name: v1, | |
126 | + }); | |
36 | 127 | }; |
37 | 128 | const customClearStepTwoValueFunc = () => { |
38 | 129 | resetFields(); |
... | ... | @@ -42,17 +133,65 @@ |
42 | 133 | } |
43 | 134 | async function customSubmitFunc() { |
44 | 135 | try { |
45 | - const values = await validate(); | |
136 | + const values = await validateFields(); | |
46 | 137 | emit('next', values); |
47 | 138 | } catch (error) { |
48 | 139 | } finally { |
49 | 140 | } |
50 | 141 | } |
51 | - return { register, setStepTwoFieldsValueFunc, customClearStepTwoValueFunc }; | |
142 | + const defaultAddKeyAndValueFunc = () => { | |
143 | + if (keyAndValueArr.value.length == 0) { | |
144 | + keyAndValueArr.value.push({ | |
145 | + key: 1, | |
146 | + value: 1, | |
147 | + }); | |
148 | + } | |
149 | + }; | |
150 | + defaultAddKeyAndValueFunc(); | |
151 | + | |
152 | + const addKeyAndValueFunc = () => { | |
153 | + keyAndValueArr.value.push({ | |
154 | + key: 1, | |
155 | + value: 1, | |
156 | + }); | |
157 | + }; | |
158 | + const removeKeyAndValueFunc = () => { | |
159 | + keyAndValueArr.value.splice(0, 1); | |
160 | + }; | |
161 | + | |
162 | + const getSonValueFunc = async () => { | |
163 | + sonValues.configuration = await validateFields(); | |
164 | + return sonValues; | |
165 | + }; | |
166 | + return { | |
167 | + getSonValueFunc, | |
168 | + keyAndValueArr, | |
169 | + register, | |
170 | + setStepTwoFieldsValueFunc, | |
171 | + customClearStepTwoValueFunc, | |
172 | + addKeyAndValueFunc, | |
173 | + registerKeyAndValue, | |
174 | + removeKeyAndValueFunc, | |
175 | + customResetFunc, | |
176 | + }; | |
52 | 177 | }, |
53 | 178 | }); |
54 | 179 | </script> |
55 | 180 | <style lang="less" scoped> |
56 | - .step2 { | |
181 | + .root { | |
182 | + width: 45.55vw; | |
183 | + border: 1px solid #bfbfbf; | |
184 | + display: flex; | |
185 | + margin-top: 1vh; | |
186 | + .root-form { | |
187 | + width: 44vw; | |
188 | + margin: 1vh 1vw; | |
189 | + position: relative; | |
190 | + // :deep .ant-btn { | |
191 | + // position: absolute; | |
192 | + // right: 1vw; | |
193 | + // top: 1vh; | |
194 | + // } | |
195 | + } | |
57 | 196 | } |
58 | 197 | </style> | ... | ... |
1 | 1 | <template> |
2 | - <div class="step2"> <BasicForm :showSubmitButton="false" @register="register" /> </div> | |
2 | + <div class="root"> | |
3 | + <div class="root-form"> | |
4 | + <BasicForm :showSubmitButton="false" @register="register"> | |
5 | + <template #uploadAdd1="{ field }"> | |
6 | + <span style="display: none">{{ field }}</span> | |
7 | + <UploadDragger | |
8 | + v-model:fileList="fileList" | |
9 | + name="file" | |
10 | + :multiple="true" | |
11 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
12 | + @change="handleChange" | |
13 | + > | |
14 | + <p class="ant-upload-drag-icon"> | |
15 | + <InboxOutlined /> | |
16 | + </p> | |
17 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
18 | + <p class="ant-upload-hint"> | |
19 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
20 | + other band files | |
21 | + </p> | |
22 | + </UploadDragger> | |
23 | + </template> | |
24 | + <template #uploadAdd2="{ field }"> | |
25 | + <span style="display: none">{{ field }}</span> | |
26 | + <UploadDragger | |
27 | + v-model:fileList="fileList" | |
28 | + name="file" | |
29 | + :multiple="true" | |
30 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
31 | + @change="handleChange" | |
32 | + > | |
33 | + <p class="ant-upload-drag-icon"> | |
34 | + <InboxOutlined /> | |
35 | + </p> | |
36 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
37 | + <p class="ant-upload-hint"> | |
38 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
39 | + other band files | |
40 | + </p> | |
41 | + </UploadDragger> | |
42 | + </template> | |
43 | + <template #uploadAdd3="{ field }"> | |
44 | + <span style="display: none">{{ field }}</span> | |
45 | + <UploadDragger | |
46 | + v-model:fileList="fileList" | |
47 | + name="file" | |
48 | + :multiple="true" | |
49 | + action="https://www.mocky.io/v2/5cc8019d300000980a055e76" | |
50 | + @change="handleChange" | |
51 | + > | |
52 | + <p class="ant-upload-drag-icon"> | |
53 | + <InboxOutlined /> | |
54 | + </p> | |
55 | + <p class="ant-upload-text">Click or drag file to this area to upload</p> | |
56 | + <p class="ant-upload-hint"> | |
57 | + Support for a single or bulk upload. Strictly prohibit from uploading company data or | |
58 | + other band files | |
59 | + </p> | |
60 | + </UploadDragger> | |
61 | + </template> | |
62 | + </BasicForm> | |
63 | + </div> | |
64 | + </div> | |
3 | 65 | </template> |
4 | 66 | <script lang="ts"> |
5 | - import { defineComponent } from 'vue'; | |
67 | + import { defineComponent, ref, reactive } from 'vue'; | |
6 | 68 | import { BasicForm, useForm } from '/@/components/Form'; |
7 | - import { modeKafkaForm } from './config'; | |
8 | - | |
9 | - import { Alert, Divider, Descriptions } from 'ant-design-vue'; | |
69 | + import { modeMqttForm } from '../config'; | |
70 | + import { InboxOutlined } from '@ant-design/icons-vue'; | |
71 | + import { Alert, Divider, Descriptions, UploadDragger } from 'ant-design-vue'; | |
10 | 72 | |
11 | 73 | export default defineComponent({ |
12 | 74 | components: { |
... | ... | @@ -15,12 +77,18 @@ |
15 | 77 | [Divider.name]: Divider, |
16 | 78 | [Descriptions.name]: Descriptions, |
17 | 79 | [Descriptions.Item.name]: Descriptions.Item, |
80 | + InboxOutlined, | |
81 | + UploadDragger, | |
18 | 82 | }, |
19 | 83 | emits: ['next', 'prev', 'register'], |
20 | 84 | setup(_, { emit }) { |
85 | + const fileList = ref<[]>([]); | |
86 | + const sonValues = reactive({ | |
87 | + configuration: {}, | |
88 | + }); | |
21 | 89 | const [register, { validate, setFieldsValue, resetFields }] = useForm({ |
22 | 90 | labelWidth: 80, |
23 | - schemas: modeKafkaForm, | |
91 | + schemas: modeMqttForm, | |
24 | 92 | actionColOptions: { |
25 | 93 | span: 14, |
26 | 94 | }, |
... | ... | @@ -48,11 +116,39 @@ |
48 | 116 | } finally { |
49 | 117 | } |
50 | 118 | } |
51 | - return { register, setStepTwoFieldsValueFunc, customClearStepTwoValueFunc }; | |
119 | + const handleChange = () => {}; | |
120 | + const getSonValueFunc = async () => { | |
121 | + sonValues.configuration = await validate(); | |
122 | + return sonValues; | |
123 | + }; | |
124 | + return { | |
125 | + getSonValueFunc, | |
126 | + register, | |
127 | + setStepTwoFieldsValueFunc, | |
128 | + customClearStepTwoValueFunc, | |
129 | + fileList, | |
130 | + handleChange, | |
131 | + }; | |
52 | 132 | }, |
53 | 133 | }); |
54 | 134 | </script> |
55 | 135 | <style lang="less" scoped> |
56 | - .step2 { | |
136 | + .root { | |
137 | + width: 45.55vw; | |
138 | + height: 51vh; | |
139 | + border: 1px solid #bfbfbf; | |
140 | + display: flex; | |
141 | + margin-top: 1vh; | |
142 | + .root-form { | |
143 | + width: 44vw; | |
144 | + height: 45vh; | |
145 | + margin: 1vh 1vw; | |
146 | + position: relative; | |
147 | + :deep .ant-btn { | |
148 | + position: absolute; | |
149 | + right: 1vw; | |
150 | + top: 6vh; | |
151 | + } | |
152 | + } | |
57 | 153 | } |
58 | 154 | </style> | ... | ... |
1 | 1 | <template> |
2 | - <div class="step2"> <BasicForm :showSubmitButton="false" @register="register" /> </div> | |
2 | + <div class="root"> | |
3 | + <div class="root-form"> | |
4 | + <BasicForm :showSubmitButton="false" @register="register"> | |
5 | + <template #addKeyAndValue="{ field }"> | |
6 | + <span style="display: none">{{ field }}</span> | |
7 | + <div> | |
8 | + <div> | |
9 | + <template v-for="(item, index) in keyAndValueArr" :key="index"> | |
10 | + <span style="display: none">{{ item + index }}</span> | |
11 | + <BasicForm | |
12 | + :showResetButton="false" | |
13 | + :showSubmitButton="false" | |
14 | + @register="registerKeyAndValue" | |
15 | + /> | |
16 | + </template> | |
17 | + <div | |
18 | + style=" | |
19 | + width: 5vw; | |
20 | + height: 3vh; | |
21 | + display: flex; | |
22 | + flex-direction: row; | |
23 | + justify-content: center; | |
24 | + align-items: center; | |
25 | + margin-left: 1.8vw; | |
26 | + " | |
27 | + > | |
28 | + <div | |
29 | + style=" | |
30 | + width: 2.6vw; | |
31 | + height: 3vh; | |
32 | + background-color: #0960bd; | |
33 | + border-radius: 10px; | |
34 | + cursor: pointer; | |
35 | + text-align: center; | |
36 | + line-height: 2.89vh; | |
37 | + " | |
38 | + > | |
39 | + <span @click="addKeyAndValueFunc" style="color: white">添加</span> | |
40 | + </div> | |
41 | + <div | |
42 | + style=" | |
43 | + width: 2.6vw; | |
44 | + height: 3vh; | |
45 | + margin-left: 1vw; | |
46 | + background-color: #ed6f6f; | |
47 | + border-radius: 10px; | |
48 | + cursor: pointer; | |
49 | + text-align: center; | |
50 | + line-height: 2.89vh; | |
51 | + " | |
52 | + > | |
53 | + <span @click="removeKeyAndValueFunc" style="color: white">删除</span> | |
54 | + </div> | |
55 | + </div> | |
56 | + <div> </div> | |
57 | + </div> | |
58 | + </div> | |
59 | + </template> | |
60 | + </BasicForm> | |
61 | + </div> | |
62 | + </div> | |
3 | 63 | </template> |
4 | 64 | <script lang="ts"> |
5 | - import { defineComponent } from 'vue'; | |
65 | + import { defineComponent, ref, reactive } from 'vue'; | |
6 | 66 | import { BasicForm, useForm } from '/@/components/Form'; |
7 | - import { modeKafkaForm } from './config'; | |
67 | + import { modeRabbitMqForm, modeKafkaInseretKeyAndValueForm } from '../config'; | |
8 | 68 | |
9 | 69 | import { Alert, Divider, Descriptions } from 'ant-design-vue'; |
10 | 70 | |
... | ... | @@ -18,9 +78,14 @@ |
18 | 78 | }, |
19 | 79 | emits: ['next', 'prev', 'register'], |
20 | 80 | setup(_, { emit }) { |
81 | + const keyAndValueArr = ref<[]>([]); | |
82 | + const sonValues = reactive({ | |
83 | + configuration: {}, | |
84 | + }); | |
85 | + | |
21 | 86 | const [register, { validate, setFieldsValue, resetFields }] = useForm({ |
22 | 87 | labelWidth: 80, |
23 | - schemas: modeKafkaForm, | |
88 | + schemas: modeRabbitMqForm, | |
24 | 89 | actionColOptions: { |
25 | 90 | span: 14, |
26 | 91 | }, |
... | ... | @@ -31,6 +96,15 @@ |
31 | 96 | resetFunc: customResetFunc, |
32 | 97 | submitFunc: customSubmitFunc, |
33 | 98 | }); |
99 | + | |
100 | + const [registerKeyAndValue] = useForm({ | |
101 | + labelWidth: 80, | |
102 | + schemas: modeKafkaInseretKeyAndValueForm, | |
103 | + actionColOptions: { | |
104 | + span: 14, | |
105 | + }, | |
106 | + }); | |
107 | + | |
34 | 108 | const setStepTwoFieldsValueFunc = (v) => { |
35 | 109 | setFieldsValue(v); |
36 | 110 | }; |
... | ... | @@ -48,11 +122,57 @@ |
48 | 122 | } finally { |
49 | 123 | } |
50 | 124 | } |
51 | - return { register, setStepTwoFieldsValueFunc, customClearStepTwoValueFunc }; | |
125 | + const defaultAddKeyAndValueFunc = () => { | |
126 | + if (keyAndValueArr.value.length == 0) { | |
127 | + keyAndValueArr.value.push({ | |
128 | + key: 1, | |
129 | + value: 1, | |
130 | + }); | |
131 | + } | |
132 | + }; | |
133 | + defaultAddKeyAndValueFunc(); | |
134 | + | |
135 | + const addKeyAndValueFunc = () => { | |
136 | + keyAndValueArr.value.push({ | |
137 | + key: 1, | |
138 | + value: 1, | |
139 | + }); | |
140 | + }; | |
141 | + const removeKeyAndValueFunc = () => { | |
142 | + keyAndValueArr.value.splice(0, 1); | |
143 | + }; | |
144 | + const getSonValueFunc = async () => { | |
145 | + sonValues.configuration = await validate(); | |
146 | + return sonValues; | |
147 | + }; | |
148 | + | |
149 | + return { | |
150 | + getSonValueFunc, | |
151 | + register, | |
152 | + setStepTwoFieldsValueFunc, | |
153 | + customClearStepTwoValueFunc, | |
154 | + keyAndValueArr, | |
155 | + registerKeyAndValue, | |
156 | + addKeyAndValueFunc, | |
157 | + removeKeyAndValueFunc, | |
158 | + }; | |
52 | 159 | }, |
53 | 160 | }); |
54 | 161 | </script> |
55 | 162 | <style lang="less" scoped> |
56 | - .step2 { | |
163 | + .root { | |
164 | + width: 45.55vw; | |
165 | + border: 1px solid #bfbfbf; | |
166 | + display: flex; | |
167 | + margin-top: 1vh; | |
168 | + .root-form { | |
169 | + width: 44vw; | |
170 | + margin: 1vh 1vw; | |
171 | + position: relative; | |
172 | + :deep .ant-btn { | |
173 | + position: absolute; | |
174 | + right: 1vw; | |
175 | + } | |
176 | + } | |
57 | 177 | } |
58 | 178 | </style> | ... | ... |
1 | 1 | <template> |
2 | - <div class="step1"> | |
3 | - <div class="step1-form"> | |
2 | + <div class="root"> | |
3 | + <div class="root-form"> | |
4 | 4 | <div> |
5 | 5 | <BasicForm @register="register" /> |
6 | 6 | </div> |
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 | </div> |
9 | 9 | </template> |
10 | 10 | <script lang="ts"> |
11 | - import { defineComponent } from 'vue'; | |
11 | + import { defineComponent, ref } from 'vue'; | |
12 | 12 | import { BasicForm, useForm } from '/@/components/Form'; |
13 | 13 | import { modeForm } from './config'; |
14 | 14 | import { Select, Input, Divider } from 'ant-design-vue'; |
... | ... | @@ -23,7 +23,8 @@ |
23 | 23 | }, |
24 | 24 | emits: ['next', 'resetFunc', 'register'], |
25 | 25 | setup(_, { emit }) { |
26 | - const [register, { validate, setFieldsValue, resetFields }] = useForm({ | |
26 | + const sonValues = ref({}); | |
27 | + const [register, { validateFields, setFieldsValue, resetFields }] = useForm({ | |
27 | 28 | labelWidth: 100, |
28 | 29 | schemas: modeForm, |
29 | 30 | actionColOptions: { |
... | ... | @@ -38,7 +39,7 @@ |
38 | 39 | //提交数据 |
39 | 40 | async function customSubmitFunc() { |
40 | 41 | try { |
41 | - const values = await validate(); | |
42 | + const values = await validateFields(); | |
42 | 43 | emit('next', values); |
43 | 44 | } catch (error) {} |
44 | 45 | } |
... | ... | @@ -51,7 +52,12 @@ |
51 | 52 | const customResetStepOneFunc = () => { |
52 | 53 | resetFields(); |
53 | 54 | }; |
55 | + const getSonValueFunc = async () => { | |
56 | + sonValues.value = await validateFields(); | |
57 | + return sonValues.value; | |
58 | + }; | |
54 | 59 | return { |
60 | + getSonValueFunc, | |
55 | 61 | register, |
56 | 62 | setStepOneFieldsValueFunc, |
57 | 63 | customResetStepOneFunc, |
... | ... | @@ -60,52 +66,19 @@ |
60 | 66 | }); |
61 | 67 | </script> |
62 | 68 | <style lang="less" scoped> |
63 | - .step1 { | |
64 | - &-form { | |
65 | - width: 800px; | |
66 | - height: 300px; | |
67 | - margin: 15px auto; | |
68 | - } | |
69 | - | |
70 | - h3 { | |
71 | - margin: 0 0 12px; | |
72 | - font-size: 16px; | |
73 | - line-height: 32px; | |
74 | - color: @text-color; | |
75 | - } | |
76 | - | |
77 | - h4 { | |
78 | - margin: 0 0 4px; | |
79 | - font-size: 14px; | |
80 | - line-height: 22px; | |
81 | - color: @text-color; | |
82 | - } | |
83 | - | |
84 | - p { | |
85 | - color: @text-color; | |
86 | - } | |
87 | - .device-icon-style { | |
88 | - :deep .ant-upload-select-picture-card { | |
89 | - display: inherit; | |
90 | - float: none; | |
91 | - width: 8.6vw; | |
92 | - height: 17vh; | |
93 | - margin-right: 8px; | |
94 | - text-align: center; | |
95 | - vertical-align: top; | |
96 | - background-color: #fafafa; | |
97 | - border: 1px dashed #d9d9d9; | |
98 | - cursor: pointer; | |
99 | - transition: border-color 0.3s ease; | |
69 | + .root { | |
70 | + width: 100vw; | |
71 | + height: 30vh; | |
72 | + .root-form { | |
73 | + width: 40vw; | |
74 | + position: relative; | |
75 | + left: 10vw; | |
76 | + top: 8vh; | |
77 | + :deep .ant-btn { | |
78 | + position: absolute; | |
79 | + right: 8.1vw; | |
80 | + top: 6vh; | |
100 | 81 | } |
101 | 82 | } |
102 | 83 | } |
103 | - | |
104 | - .pay-select { | |
105 | - width: 20%; | |
106 | - } | |
107 | - | |
108 | - .pay-input { | |
109 | - width: 70%; | |
110 | - } | |
111 | 84 | </style> | ... | ... |
1 | 1 | <template> |
2 | - <div class="step2"> <BasicForm :showSubmitButton="false" @register="register" /> </div> | |
2 | + <div class="step2"> | |
3 | + <div> | |
4 | + <div v-show="isWhereComp == 'KafKA'"> | |
5 | + <TransferConfigKafka ref="refTransferConfigKafka" @prev="getSonPrev" /> | |
6 | + </div> | |
7 | + <div v-show="isWhereComp == 'MQTT'"> | |
8 | + <TransferConfigMqtt ref="refTransferConfigMqtt" @prev="getSonPrev" /> | |
9 | + </div> | |
10 | + <div v-show="isWhereComp == 'RabbitMq'"> | |
11 | + <TransferConfigRabbitMq ref="refTransferConfigRabbitMq" @prev="getSonPrev" /> | |
12 | + </div> | |
13 | + <div v-show="isWhereComp == 'Api'"> | |
14 | + <TransferConfigApi ref="refTransferConfigApi" @prev="getSonPrev" /> | |
15 | + </div> | |
16 | + </div> | |
17 | + </div> | |
3 | 18 | </template> |
4 | 19 | <script lang="ts"> |
5 | - import { defineComponent } from 'vue'; | |
6 | - import { BasicForm, useForm } from '/@/components/Form'; | |
7 | - import { modeKafkaForm } from './config'; | |
8 | - | |
20 | + import { defineComponent, watch, ref, getCurrentInstance, reactive } from 'vue'; | |
21 | + import TransferConfigKafka from '../cpns/cpns/transferConfigKafka.vue'; | |
22 | + import TransferConfigMqtt from '../cpns/cpns/transferConfigMqtt.vue'; | |
23 | + import TransferConfigRabbitMq from '../cpns/cpns/transferConfigRabbitMq.vue'; | |
24 | + import TransferConfigApi from '../cpns/cpns/transferConfigApi.vue'; | |
9 | 25 | import { Alert, Divider, Descriptions } from 'ant-design-vue'; |
10 | 26 | |
11 | 27 | export default defineComponent({ |
12 | 28 | components: { |
13 | - BasicForm, | |
14 | 29 | [Alert.name]: Alert, |
15 | 30 | [Divider.name]: Divider, |
16 | 31 | [Descriptions.name]: Descriptions, |
17 | 32 | [Descriptions.Item.name]: Descriptions.Item, |
33 | + TransferConfigKafka, | |
34 | + TransferConfigMqtt, | |
35 | + TransferConfigRabbitMq, | |
36 | + TransferConfigApi, | |
18 | 37 | }, |
19 | - emits: ['next', 'prev', 'register'], | |
20 | - setup(_, { emit }) { | |
21 | - const [register, { validate, setFieldsValue, resetFields }] = useForm({ | |
22 | - labelWidth: 80, | |
23 | - schemas: modeKafkaForm, | |
24 | - actionColOptions: { | |
25 | - span: 14, | |
26 | - }, | |
27 | - resetButtonOptions: { | |
28 | - text: '上一步', | |
29 | - }, | |
30 | - | |
31 | - resetFunc: customResetFunc, | |
32 | - submitFunc: customSubmitFunc, | |
38 | + // eslint-disable-next-line vue/require-prop-types | |
39 | + props: ['getModeSelect'], | |
40 | + emits: ['prevSon'], | |
41 | + setup(props, { emit }) { | |
42 | + const { proxy } = getCurrentInstance(); | |
43 | + const getTransferConfigKafkaValue = ref({}); | |
44 | + const refTransferConfigKafka = ref(null); | |
45 | + const refTransferConfigMqtt = ref(null); | |
46 | + const refTransferConfigRabbitMq = ref(null); | |
47 | + const refTransferConfigApi = ref(null); | |
48 | + const isWhereComp = ref(''); | |
49 | + const editSonData = reactive({ | |
50 | + type: '', | |
51 | + configuration: {}, | |
52 | + name: '', | |
33 | 53 | }); |
34 | - const setStepTwoFieldsValueFunc = (v) => { | |
35 | - setFieldsValue(v); | |
36 | - }; | |
37 | - const customClearStepTwoValueFunc = () => { | |
38 | - resetFields(); | |
54 | + const getSonPrev = () => { | |
55 | + emit('prevSon'); | |
39 | 56 | }; |
40 | - async function customResetFunc() { | |
41 | - emit('prev'); | |
42 | - } | |
43 | - async function customSubmitFunc() { | |
57 | + watch( | |
58 | + () => props.getModeSelect, | |
59 | + (val) => { | |
60 | + isWhereComp.value = val.type; | |
61 | + } | |
62 | + ); | |
63 | + const clearSonValueDataFunc = () => { | |
44 | 64 | try { |
45 | - const values = await validate(); | |
46 | - emit('next', values); | |
47 | - } catch (error) { | |
48 | - } finally { | |
65 | + if (isWhereComp.value == 'KafKA') { | |
66 | + proxy.$refs.refTransferConfigKafka.customClearStepTwoValueFunc(); | |
67 | + } else if (isWhereComp.value == 'MQTT') { | |
68 | + proxy.$refs.refTransferConfigMqtt.customClearStepTwoValueFunc(); | |
69 | + } else if (isWhereComp.value == 'RabbitMq') { | |
70 | + proxy.$refs.refTransferConfigRabbitMq.customClearStepTwoValueFunc(); | |
71 | + } else if (isWhereComp.value == 'Api') { | |
72 | + proxy.$refs.refTransferConfigApi.customClearStepTwoValueFunc(); | |
73 | + } | |
74 | + } catch (e) { | |
75 | + return e; | |
76 | + } | |
77 | + }; | |
78 | + const getSonValueDataFunc = () => { | |
79 | + if (isWhereComp.value == 'KafKA') { | |
80 | + getTransferConfigKafkaValue.value = proxy.$refs.refTransferConfigKafka.getSonValueFunc(); | |
81 | + } else if (isWhereComp.value == 'MQTT') { | |
82 | + getTransferConfigKafkaValue.value = proxy.$refs.refTransferConfigMqtt.getSonValueFunc(); | |
83 | + } else if (isWhereComp.value == 'RabbitMq') { | |
84 | + getTransferConfigKafkaValue.value = | |
85 | + proxy.$refs.refTransferConfigRabbitMq.getSonValueFunc(); | |
86 | + } else if (isWhereComp.value == 'Api') { | |
87 | + getTransferConfigKafkaValue.value = proxy.$refs.refTransferConfigApi.getSonValueFunc(); | |
88 | + } | |
89 | + return getTransferConfigKafkaValue.value; | |
90 | + }; | |
91 | + const editSonValueDataFunc = (v) => { | |
92 | + editSonData.type = v.type; | |
93 | + editSonData.configuration = v.configuration; | |
94 | + editSonData.name = v.name; | |
95 | + if (editSonData.type == 'KafKA') { | |
96 | + isWhereComp.value = editSonData.type; | |
97 | + try { | |
98 | + setTimeout(() => { | |
99 | + proxy.$refs.refTransferConfigKafka.setStepTwoFieldsValueFunc( | |
100 | + editSonData.configuration, | |
101 | + editSonData.name | |
102 | + ); | |
103 | + }, 10); | |
104 | + } catch (e) { | |
105 | + return e; | |
106 | + } | |
107 | + } else if (editSonData.type == 'MQTT') { | |
108 | + isWhereComp.value = editSonData.type; | |
109 | + proxy.$refs.refTransferConfigMqtt.setStepTwoFieldsValueFunc( | |
110 | + editSonData.configuration, | |
111 | + editSonData.name | |
112 | + ); | |
113 | + } else if (editSonData.type == 'RabbitMq') { | |
114 | + isWhereComp.value = editSonData.type; | |
115 | + proxy.$refs.refTransferConfigRabbitMq.setStepTwoFieldsValueFunc( | |
116 | + editSonData.configuration, | |
117 | + editSonData.name | |
118 | + ); | |
119 | + } else if (editSonData.type == 'Api') { | |
120 | + isWhereComp.value = editSonData.type; | |
121 | + proxy.$refs.refTransferConfigApi.setStepTwoFieldsValueFunc( | |
122 | + editSonData.configuration, | |
123 | + editSonData.name | |
124 | + ); | |
49 | 125 | } |
50 | - } | |
51 | - return { register, setStepTwoFieldsValueFunc, customClearStepTwoValueFunc }; | |
126 | + }; | |
127 | + return { | |
128 | + clearSonValueDataFunc, | |
129 | + editSonValueDataFunc, | |
130 | + refTransferConfigKafka, | |
131 | + getSonValueDataFunc, | |
132 | + getSonPrev, | |
133 | + isWhereComp, | |
134 | + refTransferConfigMqtt, | |
135 | + refTransferConfigRabbitMq, | |
136 | + refTransferConfigApi, | |
137 | + }; | |
52 | 138 | }, |
53 | 139 | }); |
54 | 140 | </script> |
55 | -<style lang="less" scoped> | |
56 | - .step2 { | |
57 | - } | |
58 | -</style> | |
141 | +<style lang="less" scoped></style> | ... | ... |
1 | 1 | <template> |
2 | 2 | <div> |
3 | - <BasicTable @register="registerTable" :rowSelection="{ type: 'checkbox' }"> | |
3 | + <BasicTable | |
4 | + @selection-change="useSelectionChange" | |
5 | + @register="registerTable" | |
6 | + :rowSelection="{ type: 'checkbox' }" | |
7 | + > | |
4 | 8 | <template #toolbar> |
5 | 9 | <a-button type="primary" @click="handleAdd"> 添加转换 </a-button> |
6 | - <a-button style="background-color: rgba(237, 111, 111, 1)" type="default"> | |
7 | - <span style="color: white">删除</span> | |
10 | + <a-button | |
11 | + @click="handleDelete" | |
12 | + style="background-color: rgba(237, 111, 111, 1)" | |
13 | + type="default" | |
14 | + > | |
15 | + <span style="color: white">批量删除</span> | |
8 | 16 | </a-button> |
9 | 17 | </template> |
10 | 18 | <template #action="{ record }"> |
... | ... | @@ -13,18 +21,38 @@ |
13 | 21 | { |
14 | 22 | label: '编辑', |
15 | 23 | icon: 'clarity:note-edit-line', |
24 | + onClick: handleEdit.bind(null, record), | |
16 | 25 | }, |
17 | - { | |
18 | - label: '警用', | |
19 | - icon: 'clarity:note-edit-line', | |
20 | - }, | |
26 | + | |
21 | 27 | { |
22 | 28 | label: '删除', |
23 | 29 | icon: 'ant-design:delete-outlined', |
24 | 30 | color: 'error', |
25 | 31 | popConfirm: { |
26 | 32 | title: '是否确认删除', |
27 | - confirm: handleDelete.bind(null, record), | |
33 | + confirm: handleSingleDelete.bind(null, record), | |
34 | + }, | |
35 | + }, | |
36 | + ]" | |
37 | + :dropDownActions="[ | |
38 | + { | |
39 | + label: '启用', | |
40 | + popConfirm: { | |
41 | + title: '是否启用?', | |
42 | + confirm: handleEnableOrDisable.bind(null, record), | |
43 | + }, | |
44 | + ifShow: (_action) => { | |
45 | + return record.status !== 'enable'; // 根据业务控制是否显示: 非enable状态的不显示启用按钮 | |
46 | + }, | |
47 | + }, | |
48 | + { | |
49 | + label: '禁用', | |
50 | + popConfirm: { | |
51 | + title: '是否禁用?', | |
52 | + confirm: handleEnableOrDisable.bind(null, record), | |
53 | + }, | |
54 | + ifShow: () => { | |
55 | + return record.status === 'enable'; // 根据业务控制是否显示: enable状态的显示禁用按钮 | |
28 | 56 | }, |
29 | 57 | }, |
30 | 58 | ]" |
... | ... | @@ -37,21 +65,34 @@ |
37 | 65 | </div> |
38 | 66 | </template> |
39 | 67 | <script lang="ts"> |
40 | - import { defineComponent } from 'vue'; | |
68 | + import { defineComponent, reactive } from 'vue'; | |
41 | 69 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
42 | 70 | import { columns, searchFormSchema } from './config'; |
43 | 71 | import { useModal } from '/@/components/Modal'; |
44 | 72 | import DataTransferDrawer from './addDataTransferDrawer.vue'; |
73 | + import { | |
74 | + getConvertApi, | |
75 | + isEnableOrDisableApi, | |
76 | + deleteConvertApi, | |
77 | + } from '/@/api/datamanager/dataManagerApi'; | |
78 | + import { useMessage } from '/@/hooks/web/useMessage'; | |
45 | 79 | |
46 | 80 | export default defineComponent({ |
47 | 81 | name: 'Index', |
48 | 82 | components: { BasicTable, TableAction, DataTransferDrawer }, |
49 | 83 | setup() { |
84 | + const enableObj = reactive({ | |
85 | + convertIds: [], | |
86 | + status: 0, | |
87 | + }); | |
88 | + const { createMessage } = useMessage(); | |
89 | + let selectedRowKeys: Array<string> = []; | |
50 | 90 | const [registerModal, { openModal }] = useModal(); |
51 | - const [registerTable, { reload }] = useTable({ | |
52 | - title: '场景联动列表', | |
91 | + const [registerTable, { reload, getSelectRowKeys }] = useTable({ | |
92 | + title: '数据转换列表', | |
53 | 93 | clickToRowSelect: false, |
54 | 94 | columns, |
95 | + api: getConvertApi, | |
55 | 96 | formConfig: { |
56 | 97 | labelWidth: 120, |
57 | 98 | schemas: searchFormSchema, |
... | ... | @@ -72,16 +113,55 @@ |
72 | 113 | |
73 | 114 | //新增 |
74 | 115 | const handleAdd = () => { |
75 | - openModal(true, { | |
76 | - isUpdate: false, | |
77 | - }); | |
78 | - }; | |
79 | - const handleDelete = (record: Recordable) => { | |
80 | - console.log(record); | |
116 | + setTimeout(() => { | |
117 | + openModal(true, { | |
118 | + isUpdate: false, | |
119 | + }); | |
120 | + }, 10); | |
81 | 121 | }; |
122 | + | |
82 | 123 | const handleSuccess = () => { |
83 | 124 | reload(); |
84 | 125 | }; |
126 | + const handleEdit = (record: Recordable) => { | |
127 | + setTimeout(() => { | |
128 | + openModal(true, { | |
129 | + record, | |
130 | + isUpdate: true, | |
131 | + }); | |
132 | + }, 10); | |
133 | + }; | |
134 | + const handleEnableOrDisable = async (record: Recordable) => { | |
135 | + enableObj.status = record.status; | |
136 | + if (enableObj.status == 1) return; | |
137 | + if (enableObj.convertIds.length == 0) { | |
138 | + enableObj.convertIds.push(record.id as never); | |
139 | + } | |
140 | + if (enableObj.status == 0) { | |
141 | + enableObj.status = 1; | |
142 | + } | |
143 | + await isEnableOrDisableApi(enableObj as never); | |
144 | + createMessage.success('转换配置启用成功'); | |
145 | + }; | |
146 | + const handleSingleDelete = async (record: Recordable) => { | |
147 | + try { | |
148 | + let ids = [record.id]; | |
149 | + await deleteConvertApi(ids); | |
150 | + createMessage.success('删除成功'); | |
151 | + reload(); | |
152 | + } catch (e) { | |
153 | + return e; | |
154 | + } | |
155 | + }; | |
156 | + const useSelectionChange = () => { | |
157 | + selectedRowKeys = getSelectRowKeys(); | |
158 | + }; | |
159 | + | |
160 | + const handleDelete = async () => { | |
161 | + await deleteConvertApi(selectedRowKeys); | |
162 | + createMessage.success('删除成功'); | |
163 | + reload(); | |
164 | + }; | |
85 | 165 | |
86 | 166 | return { |
87 | 167 | registerTable, |
... | ... | @@ -89,6 +169,10 @@ |
89 | 169 | handleDelete, |
90 | 170 | registerModal, |
91 | 171 | handleSuccess, |
172 | + handleEdit, | |
173 | + handleEnableOrDisable, | |
174 | + handleSingleDelete, | |
175 | + useSelectionChange, | |
92 | 176 | }; |
93 | 177 | }, |
94 | 178 | }); | ... | ... |
... | ... | @@ -40,19 +40,6 @@ export const searchFormSchema: FormSchema[] = [ |
40 | 40 | maxLength: 255, |
41 | 41 | placeholder: '请输入租户配置名称', |
42 | 42 | }, |
43 | - dynamicRules: () => { | |
44 | - return [ | |
45 | - { | |
46 | - required: false, | |
47 | - validator: (_, value) => { | |
48 | - if (String(value).length > 255) { | |
49 | - return Promise.reject('字数不超过255个字'); | |
50 | - } | |
51 | - return Promise.resolve(); | |
52 | - }, | |
53 | - }, | |
54 | - ]; | |
55 | - }, | |
56 | 43 | }, |
57 | 44 | ]; |
58 | 45 | export const formSchema: FormSchema[] = [ |
... | ... | @@ -88,18 +75,5 @@ export const formSchema: FormSchema[] = [ |
88 | 75 | maxLength: 255, |
89 | 76 | placeholder: '请输入说明', |
90 | 77 | }, |
91 | - dynamicRules: () => { | |
92 | - return [ | |
93 | - { | |
94 | - required: false, | |
95 | - validator: (_, value) => { | |
96 | - if (String(value).length > 255) { | |
97 | - return Promise.reject('字数不超过255个字'); | |
98 | - } | |
99 | - return Promise.resolve(); | |
100 | - }, | |
101 | - }, | |
102 | - ]; | |
103 | - }, | |
104 | 78 | }, |
105 | 79 | ]; | ... | ... |