From 0c0a1994b29a42d5816588db1b1560cdbc6d3a00 Mon Sep 17 00:00:00 2001 From: fhysy <1149505133@qq.com> Date: Fri, 15 Aug 2025 17:43:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E5=88=86=E7=BB=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在产品详情页面添加属性分组标签页 - 实现属性分组的创建、编辑和删除功能 - 添加属性分组的排序和描述信息 - 优化属性选择界面,支持搜索和过滤功能 --- README.md | 2 + .../product/detail/components/EventDrawer.vue | 1 + .../detail/components/FunctionDrawer.vue | 1 + .../product/detail/components/Metadata.vue | 18 ++ .../detail/components/MetadataTable.vue | 27 +- .../detail/components/PropertyDrawer.vue | 1 + .../detail/components/PropertyGroupDrawer.vue | 304 ++++++++++++++++++ .../components/PropertySelectionModal.vue | 231 +++++++++++++ 8 files changed, 584 insertions(+), 1 deletion(-) create mode 100644 apps/web-antd/src/views/device/product/detail/components/PropertyGroupDrawer.vue create mode 100644 apps/web-antd/src/views/device/product/detail/components/PropertySelectionModal.vue diff --git a/README.md b/README.md index e027949..c605b8c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +启动项目pnpm run dev:antd +
VbenAdmin Logo diff --git a/apps/web-antd/src/views/device/product/detail/components/EventDrawer.vue b/apps/web-antd/src/views/device/product/detail/components/EventDrawer.vue index 36d65a2..7aa1054 100644 --- a/apps/web-antd/src/views/device/product/detail/components/EventDrawer.vue +++ b/apps/web-antd/src/views/device/product/detail/components/EventDrawer.vue @@ -118,6 +118,7 @@ const formRules = { }, ], name: [{ required: true, message: '请输入名称', trigger: 'blur' }], + sort: [{ required: true, message: '请输入排序', trigger: 'blur' }], // 'valueParams.dataType': [ // { required: true, message: '请选择数据类型', trigger: 'blur' }, // ], diff --git a/apps/web-antd/src/views/device/product/detail/components/FunctionDrawer.vue b/apps/web-antd/src/views/device/product/detail/components/FunctionDrawer.vue index 9c08229..2b9645c 100644 --- a/apps/web-antd/src/views/device/product/detail/components/FunctionDrawer.vue +++ b/apps/web-antd/src/views/device/product/detail/components/FunctionDrawer.vue @@ -155,6 +155,7 @@ const formRules = { }, ], name: [{ required: true, message: '请输入名称', trigger: 'blur' }], + sort: [{ required: true, message: '请输入排序', trigger: 'blur' }], }; // 抽屉标题 diff --git a/apps/web-antd/src/views/device/product/detail/components/Metadata.vue b/apps/web-antd/src/views/device/product/detail/components/Metadata.vue index 2dc6822..55ffc73 100644 --- a/apps/web-antd/src/views/device/product/detail/components/Metadata.vue +++ b/apps/web-antd/src/views/device/product/detail/components/Metadata.vue @@ -38,6 +38,7 @@ const currentMetadata = ref({ properties: [], functions: [], events: [], + propertyGroups: [], // 新增属性分组 }); // 标签页切换 @@ -97,6 +98,7 @@ const loadMetadata = async () => { properties: [], functions: [], events: [], + propertyGroups: [], // 新增属性分组 }; try { currentMetadata.value = props.productInfo.metadata @@ -212,6 +214,7 @@ const handleSave = async () => { metadata.properties.sort((a: any, b: any) => a.sort - b.sort); metadata.functions.sort((a: any, b: any) => a.sort - b.sort); metadata.events.sort((a: any, b: any) => a.sort - b.sort); + metadata.propertyGroups.sort((a: any, b: any) => a.sort - b.sort); // 新增属性分组排序 await productUpdateById(props.productInfo.id, { id: props.productInfo.id, metadata: JSON.stringify(metadata), @@ -244,6 +247,11 @@ const handleMetadataChange = (data: any) => { currentMetadata.value.properties = data; break; } + case 'propertyGroups': { + // 新增属性分组处理 + currentMetadata.value.propertyGroups = data; + break; + } // No default } }; @@ -328,6 +336,16 @@ loadMetadata(); @refresh="loadMetadata" /> + + + (); const emit = defineEmits<{ @@ -67,6 +69,18 @@ const columns = computed(() => { fixed: 'right', }, ]; + + // 属性分组特殊列 + if (props.type === 'propertyGroups') { + baseColumns.splice(3, 0, { + title: '属性数', + dataIndex: 'properties', + key: 'count', + width: 100, + customRender: ({ record }: any) => record.properties?.length || 0, + }); + } + // 功能定义特殊列 if (props.type === 'properties') { baseColumns.splice( @@ -129,6 +143,7 @@ const getTypeLabel = () => { functions: '功能', events: '事件', tags: '标签', + propertyGroups: '分组', }; return labels[props.type]; }; @@ -319,6 +334,16 @@ onMounted(() => { :data="formData" @save="handleSave" /> + + +
diff --git a/apps/web-antd/src/views/device/product/detail/components/PropertyDrawer.vue b/apps/web-antd/src/views/device/product/detail/components/PropertyDrawer.vue index f8332a9..8233532 100644 --- a/apps/web-antd/src/views/device/product/detail/components/PropertyDrawer.vue +++ b/apps/web-antd/src/views/device/product/detail/components/PropertyDrawer.vue @@ -116,6 +116,7 @@ const formRules = { }, ], name: [{ required: true, message: '请输入名称', trigger: 'blur' }], + sort: [{ required: true, message: '请输入排序', trigger: 'blur' }], // 'valueParams.dataType': [ // { required: true, message: '请选择数据类型', trigger: 'blur' }, // ], diff --git a/apps/web-antd/src/views/device/product/detail/components/PropertyGroupDrawer.vue b/apps/web-antd/src/views/device/product/detail/components/PropertyGroupDrawer.vue new file mode 100644 index 0000000..8bc0e85 --- /dev/null +++ b/apps/web-antd/src/views/device/product/detail/components/PropertyGroupDrawer.vue @@ -0,0 +1,304 @@ + + +