diff --git a/apps/web-antd/src/views/mall/product/spu/components/index.ts b/apps/web-antd/src/views/mall/product/spu/components/index.ts
new file mode 100644
index 000000000..122cbcea0
--- /dev/null
+++ b/apps/web-antd/src/views/mall/product/spu/components/index.ts
@@ -0,0 +1,3 @@
+export { default as SkuTableSelect } from './sku-table-select.vue';
+export { default as SpuShowcase } from './spu-showcase.vue';
+export { default as SpuTableSelect } from './spu-table-select.vue';
diff --git a/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue
new file mode 100644
index 000000000..1d75f8a8f
--- /dev/null
+++ b/apps/web-antd/src/views/mall/product/spu/components/spu-showcase.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/mall/product/spu/components/spu-table-select.vue b/apps/web-antd/src/views/mall/product/spu/components/spu-table-select.vue
index 0098c9813..e503a95f8 100644
--- a/apps/web-antd/src/views/mall/product/spu/components/spu-table-select.vue
+++ b/apps/web-antd/src/views/mall/product/spu/components/spu-table-select.vue
@@ -216,6 +216,13 @@ onMounted(async () => {
categoryList.value = await getCategoryList({});
categoryTreeList.value = handleTree(categoryList.value, 'id', 'parentId');
});
+
+/** 对外暴露的方法 */
+defineExpose({
+ open: (data?: MallSpuApi.Spu | MallSpuApi.Spu[]) => {
+ modalApi.setData(data).open();
+ },
+});
diff --git a/packages/icons/src/iconify/index.ts b/packages/icons/src/iconify/index.ts
index 784a746b6..f4f2222b9 100644
--- a/packages/icons/src/iconify/index.ts
+++ b/packages/icons/src/iconify/index.ts
@@ -60,4 +60,8 @@ export const MenuOutlined = createIconifyIcon('ant-design:menu-outlined');
export const PlusOutlined = createIconifyIcon('ant-design:plus-outlined');
+export const CloseCircleFilled = createIconifyIcon(
+ 'ant-design:close-circle-filled',
+);
+
export const SelectOutlined = createIconifyIcon('ant-design:select-outlined');