From 814c3d635869769a95f092de248c0905bc95b542 Mon Sep 17 00:00:00 2001 From: zhangminghua Date: Fri, 7 Apr 2023 17:24:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=85=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E3=80=81=E6=89=93=E6=A0=87?= =?UTF-8?q?=E3=80=81=E8=B5=84=E6=BA=90=E7=94=B3=E8=AF=B7=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lib/controllers/latestMetadata/index.js | 4 +- .../metadataAcquisition/containers/adapter.js | 4 +- .../components/metadataRestapiModal.js | 196 +++++++++++++++ .../metadataManagement/constants/index.js | 1 + .../containers/restapisTable.js | 234 +++++++++++++++--- 5 files changed, 399 insertions(+), 40 deletions(-) create mode 100644 web/client/src/sections/metadataManagement/components/metadataRestapiModal.js diff --git a/api/app/lib/controllers/latestMetadata/index.js b/api/app/lib/controllers/latestMetadata/index.js index 270d518..707480a 100644 --- a/api/app/lib/controllers/latestMetadata/index.js +++ b/api/app/lib/controllers/latestMetadata/index.js @@ -169,6 +169,8 @@ async function getMetadataFiles(ctx) { const models = ctx.fs.dc.models; const { catalog, limit, offset, keywords, orderBy = 'updateAt', orderDirection = 'desc' } = ctx.query; const where = { catalog: catalog }; + //文件类型关键字查询时需匹配fileName不能为空。 + //因存在编辑时将文件删除,但未重新上传直接点击取消的情况,此时文件已删除不可恢复,数据字段fileName更新为null if (keywords) { where['$or'] = [{ name: { $iLike: `%${keywords}%` } }, { type: { $iLike: `%${keywords}%` }, fileName: { $not: null } }] } @@ -746,7 +748,7 @@ async function delMetadataRestapis(ctx) { } else { let resourceConsumptionInfo = await models.ResourceConsumption.findOne({ where: { - resourceName: metadataFileInfo.name, + resourceName: metadataRestapiInfo.name, resourceType: '接口' } }); diff --git a/web/client/src/sections/metadataAcquisition/containers/adapter.js b/web/client/src/sections/metadataAcquisition/containers/adapter.js index 5855927..6601978 100644 --- a/web/client/src/sections/metadataAcquisition/containers/adapter.js +++ b/web/client/src/sections/metadataAcquisition/containers/adapter.js @@ -7,7 +7,7 @@ import moment from 'moment'; import { RELATION_DATABASE_TOOL_CONFIG } from '../constants/adapter'; import { useFsRequest, ApiTable } from '$utils'; -const LatestMetadata = (props) => { +const Adapter = (props) => { const { history, actions, dispatch, adapters } = props; const [isModalOpen, setIsModalOpen] = useState(false); const [refreshTree, setRefreshTree] = useState(1); @@ -114,4 +114,4 @@ function mapStateToProps(state) { dataSources: datasources?.data || {}, }; } -export default connect(mapStateToProps)(LatestMetadata) \ No newline at end of file +export default connect(mapStateToProps)(Adapter) \ No newline at end of file diff --git a/web/client/src/sections/metadataManagement/components/metadataRestapiModal.js b/web/client/src/sections/metadataManagement/components/metadataRestapiModal.js new file mode 100644 index 0000000..841989a --- /dev/null +++ b/web/client/src/sections/metadataManagement/components/metadataRestapiModal.js @@ -0,0 +1,196 @@ +import React, { useEffect, useState } from 'react'; +import { Modal, Input, Form, Select, InputNumber, Tooltip, Switch } from 'antd'; +import { RestapiMethods } from '../constants/index'; +const { TextArea } = Input; +const MetadataRestapiModal = (props) => { + const { onConfirm, onCancel, editData, metadataModels } = props; + const [form] = Form.useForm(); + const [bodyParamRequired, setBodyParamRequired] = useState(false); + const [returnRequired, setReturnRequired] = useState(false); + useEffect(() => { + // form.setFieldValue('enabled', editData.record?.enabled || false); + }, []); + const handleOk = () => { + form.validateFields().then(values => { + if (onConfirm) { + let dataSave = JSON.parse(JSON.stringify(values)); + dataSave.attributesParam = {}; + metadataModels.map(m => { + dataSave.attributesParam[m.attributeCode] = values[m.attributeCode]; + delete dataSave[m.attributeCode]; + }) + onConfirm(dataSave); + } + }) + } + const isObjectString = (value) => { + if (typeof value !== "string") { + return false; + } + try { + JSON.parse(value); + return true; + } catch (e) { + return false; + } + } + const validatorNull = (rule, value, getFieldValue, validateFields, label) => { + if (!value || !value.trim().length) { + return Promise.reject(new Error(`${label}不可空字符串`)); + } + return Promise.resolve(); + } + const renderModelItems = () => { + const items = metadataModels.filter(mm => mm.modelType === '接口').map(m => { + if (m.control === '文本框') { + const rules = [{ required: !m.nullable, message: '' }] + if (!m.nullable) { + rules.push(({ getFieldValue, validateFields }) => ({ + validator(_, value) { return validatorNull(_, value, getFieldValue, validateFields, m.attributeName) } + })) + rules.push({ max: m.length, message: `${m.attributeName}不超过${m.length}个字符` }) + } + return 10 ? + {m.attributeName.substring(0, 10) + '...'} + : m.attributeName} + name={m.attributeCode} + key={m.attributeCode} + rules={rules}> + + + } else if (m.control === '数字输入框') { + const rules = [{ required: !m.nullable, message: `${m.attributeName}不可空` }] + let maxValue = ''; + let length = m.length; + if (length) { + while (length > 0) { + maxValue += '9' + length--; + } + } + return 10 ? + {m.attributeName.substring(0, 10) + '...'} + : m.attributeName} + name={m.attributeCode} + key={m.attributeCode} + rules={rules}> + + + } else { + return 10 ? + {m.attributeName.substring(0, 10) + '...'} + : m.attributeName} + name={m.attributeCode} + key={m.attributeCode} + rules={[{ required: !m.nullable, message: `${m.attributeName}不可空` }]}> + + + } + }) + return items; + } + return ( + handleOk(null)} + onCancel={onCancel}> +
+ ({ + validator(_, value) { return validatorNull(_, value, getFieldValue, validateFields, '接口名称') } + })]}> + + + ({ + validator(_, value) { return validatorNull(_, value, getFieldValue, validateFields, '接口路由') } + })]}> + + + + + + +