feat(@vben/web-antd): erp-purchase-supplier-添加供应商管理功能
- 新增供应商管理页面,包括搜索、列表、新增、编辑和删除功能 - 实现供应商数据的分页查询、导出功能 - 使用 Vben Form 和 Vxe Table 组件构建表单和表格 - 添加国际化支持pull/183/head
							parent
							
								
									8b89a32813
								
							
						
					
					
						commit
						93c0d9e486
					
				|  | @ -0,0 +1,233 @@ | ||||||
|  | import type { VbenFormSchema } from '#/adapter/form'; | ||||||
|  | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||||
|  | 
 | ||||||
|  | import { DICT_TYPE, getDictOptions } from '#/utils'; | ||||||
|  | 
 | ||||||
|  | /** 新增/修改的表单 */ | ||||||
|  | export function useFormSchema(): VbenFormSchema[] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       fieldName: 'id', | ||||||
|  |       dependencies: { | ||||||
|  |         triggerFields: [''], | ||||||
|  |         show: () => false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'name', | ||||||
|  |       label: '供应商名称', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入供应商名称', | ||||||
|  |       }, | ||||||
|  |       rules: 'required', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'contact', | ||||||
|  |       label: '联系人', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入联系人', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'mobile', | ||||||
|  |       label: '手机号码', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入手机号码', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'telephone', | ||||||
|  |       label: '联系电话', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入联系电话', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'email', | ||||||
|  |       label: '电子邮箱', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入电子邮箱', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'fax', | ||||||
|  |       label: '传真', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入传真', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'status', | ||||||
|  |       label: '开启状态', | ||||||
|  |       component: 'RadioGroup', | ||||||
|  |       componentProps: { | ||||||
|  |         options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), | ||||||
|  |       }, | ||||||
|  |       rules: 'required', | ||||||
|  |       defaultValue: 0, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'sort', | ||||||
|  |       label: '排序', | ||||||
|  |       component: 'InputNumber', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入排序', | ||||||
|  |         precision: 0, | ||||||
|  |         class: 'w-full', | ||||||
|  |       }, | ||||||
|  |       rules: 'required', | ||||||
|  |       defaultValue: 0, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'taxNo', | ||||||
|  |       label: '纳税人识别号', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入纳税人识别号', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'taxPercent', | ||||||
|  |       label: '税率(%)', | ||||||
|  |       component: 'InputNumber', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入税率', | ||||||
|  |         min: 0, | ||||||
|  |         precision: 2, | ||||||
|  |         class: 'w-full', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'bankName', | ||||||
|  |       label: '开户行', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入开户行', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'bankAccount', | ||||||
|  |       label: '开户账号', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入开户账号', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'bankAddress', | ||||||
|  |       label: '开户地址', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入开户地址', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'remark', | ||||||
|  |       label: '备注', | ||||||
|  |       component: 'Textarea', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入备注', | ||||||
|  |         rows: 3, | ||||||
|  |       }, | ||||||
|  |       formItemClass: 'col-span-2', | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 搜索表单 */ | ||||||
|  | export function useGridFormSchema(): VbenFormSchema[] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       fieldName: 'name', | ||||||
|  |       label: '供应商名称', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入供应商名称', | ||||||
|  |         allowClear: true, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'mobile', | ||||||
|  |       label: '手机号码', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请输入手机号码', | ||||||
|  |         allowClear: true, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'status', | ||||||
|  |       label: '状态', | ||||||
|  |       component: 'Select', | ||||||
|  |       componentProps: { | ||||||
|  |         placeholder: '请选择状态', | ||||||
|  |         allowClear: true, | ||||||
|  |         options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 列表的字段 */ | ||||||
|  | export function useGridColumns(): VxeTableGridOptions['columns'] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       field: 'name', | ||||||
|  |       title: '供应商名称', | ||||||
|  |       minWidth: 150, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'contact', | ||||||
|  |       title: '联系人', | ||||||
|  |       minWidth: 120, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'mobile', | ||||||
|  |       title: '手机号码', | ||||||
|  |       minWidth: 130, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'telephone', | ||||||
|  |       title: '联系电话', | ||||||
|  |       minWidth: 130, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'email', | ||||||
|  |       title: '电子邮箱', | ||||||
|  |       minWidth: 180, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'status', | ||||||
|  |       title: '状态', | ||||||
|  |       width: 100, | ||||||
|  |       cellRender: { | ||||||
|  |         name: 'CellDict', | ||||||
|  |         props: { type: DICT_TYPE.COMMON_STATUS }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'sort', | ||||||
|  |       title: '排序', | ||||||
|  |       width: 80, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'remark', | ||||||
|  |       title: '备注', | ||||||
|  |       minWidth: 150, | ||||||
|  |       showOverflow: 'tooltip', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'actions', | ||||||
|  |       title: '操作', | ||||||
|  |       width: 160, | ||||||
|  |       slots: { default: 'actions' }, | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -1,7 +1,140 @@ | ||||||
| <script lang="ts" setup> | <script lang="ts" setup> | ||||||
| import { DocAlert, Page } from '@vben/common-ui'; | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||||
|  | import type { ErpSupplierApi } from '#/api/erp/purchase/supplier'; | ||||||
| 
 | 
 | ||||||
| import { Button } from 'ant-design-vue'; | import { ref } from 'vue'; | ||||||
|  | 
 | ||||||
|  | import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; | ||||||
|  | 
 | ||||||
|  | import { message } from 'ant-design-vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenForm } from '#/adapter/form'; | ||||||
|  | import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; | ||||||
|  | import { deleteSupplier, getSupplierPage } from '#/api/erp/purchase/supplier'; | ||||||
|  | import { $t } from '#/locales'; | ||||||
|  | 
 | ||||||
|  | import { useGridColumns, useGridFormSchema } from './data'; | ||||||
|  | import SupplierForm from './modules/form.vue'; | ||||||
|  | 
 | ||||||
|  | /** 供应商管理 */ | ||||||
|  | defineOptions({ name: 'ErpSupplier' }); | ||||||
|  | 
 | ||||||
|  | const searchParams = ref<ErpSupplierApi.SupplierPageParam>({ | ||||||
|  |   pageNo: 1, | ||||||
|  |   pageSize: 10, | ||||||
|  |   name: '', | ||||||
|  |   mobile: '', | ||||||
|  |   status: undefined, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | /** 搜索表单 */ | ||||||
|  | const [SearchForm, searchFormApi] = useVbenForm({ | ||||||
|  |   commonConfig: { | ||||||
|  |     componentProps: { | ||||||
|  |       class: 'w-full', | ||||||
|  |     }, | ||||||
|  |     formItemClass: 'col-span-1', | ||||||
|  |     labelWidth: 80, | ||||||
|  |   }, | ||||||
|  |   layout: 'inline', | ||||||
|  |   schema: useGridFormSchema(), | ||||||
|  |   showDefaultActions: false, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | /** 刷新表格 */ | ||||||
|  | function onRefresh() { | ||||||
|  |   gridApi.query(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 搜索 */ | ||||||
|  | async function handleSearch() { | ||||||
|  |   const values = await searchFormApi.getValues(); | ||||||
|  |   Object.assign(searchParams.value, values, { pageNo: 1 }); | ||||||
|  |   onRefresh(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 重置搜索 */ | ||||||
|  | async function handleReset() { | ||||||
|  |   await searchFormApi.resetFields(); | ||||||
|  |   Object.assign(searchParams.value, { | ||||||
|  |     pageNo: 1, | ||||||
|  |     pageSize: 10, | ||||||
|  |     name: '', | ||||||
|  |     mobile: '', | ||||||
|  |     status: undefined, | ||||||
|  |   }); | ||||||
|  |   onRefresh(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 添加供应商 */ | ||||||
|  | function handleCreate() { | ||||||
|  |   formModalApi.setData({ type: 'create' }).open(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 编辑供应商 */ | ||||||
|  | function handleEdit(row: ErpSupplierApi.Supplier) { | ||||||
|  |   formModalApi.setData({ type: 'update', id: row.id }).open(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 删除供应商 */ | ||||||
|  | async function handleDelete(row: ErpSupplierApi.Supplier) { | ||||||
|  |   const hideLoading = message.loading({ | ||||||
|  |     content: $t('ui.actionMessage.deleting', [row.name]), | ||||||
|  |     key: 'action_key_msg', | ||||||
|  |   }); | ||||||
|  |   try { | ||||||
|  |     await deleteSupplier(row.id!); | ||||||
|  |     message.success({ | ||||||
|  |       content: $t('ui.actionMessage.deleteSuccess', [row.name]), | ||||||
|  |       key: 'action_key_msg', | ||||||
|  |     }); | ||||||
|  |     onRefresh(); | ||||||
|  |   } catch { | ||||||
|  |     hideLoading(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 导出供应商 */ | ||||||
|  | async function handleExport() { | ||||||
|  |   try { | ||||||
|  |     // const data = await exportSupplier(searchParams.value); | ||||||
|  |     // 这里需要处理文件下载逻辑 | ||||||
|  |     message.success('导出成功'); | ||||||
|  |   } catch { | ||||||
|  |     message.error('导出失败'); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const [FormModal, formModalApi] = useVbenModal({ | ||||||
|  |   connectedComponent: SupplierForm, | ||||||
|  |   destroyOnClose: true, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const [Grid, gridApi] = useVbenVxeGrid({ | ||||||
|  |   gridOptions: { | ||||||
|  |     columns: useGridColumns(), | ||||||
|  |     height: 600, | ||||||
|  |     keepSource: true, | ||||||
|  |     proxyConfig: { | ||||||
|  |       ajax: { | ||||||
|  |         query: async ({ page }) => { | ||||||
|  |           return await getSupplierPage({ | ||||||
|  |             ...searchParams.value, | ||||||
|  |             pageNo: page.currentPage, | ||||||
|  |             pageSize: page.pageSize, | ||||||
|  |           }); | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     rowConfig: { | ||||||
|  |       keyField: 'id', | ||||||
|  |     }, | ||||||
|  |     toolbarConfig: { | ||||||
|  |       refresh: true, | ||||||
|  |       custom: true, | ||||||
|  |     }, | ||||||
|  |   } as VxeTableGridOptions<ErpSupplierApi.Supplier>, | ||||||
|  | }); | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <template> | <template> | ||||||
|  | @ -12,23 +145,76 @@ import { Button } from 'ant-design-vue'; | ||||||
|         url="https://doc.iocoder.cn/erp/purchase/" |         url="https://doc.iocoder.cn/erp/purchase/" | ||||||
|       /> |       /> | ||||||
|     </template> |     </template> | ||||||
|     <Button | 
 | ||||||
|       danger |     <!-- 搜索表单 --> | ||||||
|       type="link" |     <div class="mb-4 rounded-lg bg-white p-4 shadow-sm"> | ||||||
|       target="_blank" |       <SearchForm | ||||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3" |         class="grid grid-cols-1 gap-4 md:grid-cols-3 lg:grid-cols-4" | ||||||
|     > |       /> | ||||||
|       该功能支持 Vue3 + element-plus 版本! |       <div class="mt-4 flex gap-2"> | ||||||
|     </Button> |         <TableAction | ||||||
|     <br /> |           :actions="[ | ||||||
|     <Button |             { | ||||||
|       type="link" |               label: '查询', | ||||||
|       target="_blank" |               type: 'primary', | ||||||
|       href="https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/erp/purchase/supplier/index" |               icon: ACTION_ICON.SEARCH, | ||||||
|     > |               onClick: handleSearch, | ||||||
|       可参考 |             }, | ||||||
|       https://github.com/yudaocode/yudao-ui-admin-vue3/blob/master/src/views/erp/purchase/supplier/index |             { | ||||||
|       代码,pull request 贡献给我们! |               label: '重置', | ||||||
|     </Button> |               type: 'default', | ||||||
|  |               icon: ACTION_ICON.RESET, | ||||||
|  |               onClick: handleReset, | ||||||
|  |             }, | ||||||
|  |           ]" | ||||||
|  |         /> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  | 
 | ||||||
|  |     <FormModal @success="onRefresh" /> | ||||||
|  | 
 | ||||||
|  |     <Grid> | ||||||
|  |       <template #toolbar-tools> | ||||||
|  |         <TableAction | ||||||
|  |           :actions="[ | ||||||
|  |             { | ||||||
|  |               label: '新增', | ||||||
|  |               type: 'primary', | ||||||
|  |               icon: ACTION_ICON.ADD, | ||||||
|  |               onClick: handleCreate, | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               label: '导出', | ||||||
|  |               type: 'default', | ||||||
|  |               icon: ACTION_ICON.EXPORT, | ||||||
|  |               onClick: handleExport, | ||||||
|  |             }, | ||||||
|  |           ]" | ||||||
|  |         /> | ||||||
|  |       </template> | ||||||
|  | 
 | ||||||
|  |       <template #actions="{ row }"> | ||||||
|  |         <TableAction | ||||||
|  |           :actions="[ | ||||||
|  |             { | ||||||
|  |               label: '编辑', | ||||||
|  |               type: 'link', | ||||||
|  |               icon: ACTION_ICON.EDIT, | ||||||
|  |               onClick: handleEdit.bind(null, row), | ||||||
|  |             }, | ||||||
|  |             { | ||||||
|  |               label: '删除', | ||||||
|  |               type: 'link', | ||||||
|  |               danger: true, | ||||||
|  |               icon: ACTION_ICON.DELETE, | ||||||
|  |               popConfirm: { | ||||||
|  |                 title: $t('ui.actionMessage.deleteConfirm', [row.name]), | ||||||
|  |                 confirm: handleDelete.bind(null, row), | ||||||
|  |               }, | ||||||
|  |             }, | ||||||
|  |           ]" | ||||||
|  |         /> | ||||||
|  |       </template> | ||||||
|  |     </Grid> | ||||||
|   </Page> |   </Page> | ||||||
| </template> | </template> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,102 @@ | ||||||
|  | <script lang="ts" setup> | ||||||
|  | import type { ErpSupplierApi } from '#/api/erp/purchase/supplier'; | ||||||
|  | 
 | ||||||
|  | import { ref } from 'vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenModal } from '@vben/common-ui'; | ||||||
|  | 
 | ||||||
|  | import { message } from 'ant-design-vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenForm } from '#/adapter/form'; | ||||||
|  | import { | ||||||
|  |   createSupplier, | ||||||
|  |   getSupplier, | ||||||
|  |   updateSupplier, | ||||||
|  | } from '#/api/erp/purchase/supplier'; | ||||||
|  | import { $t } from '#/locales'; | ||||||
|  | 
 | ||||||
|  | import { useFormSchema } from '../data'; | ||||||
|  | 
 | ||||||
|  | const emit = defineEmits(['success']); | ||||||
|  | 
 | ||||||
|  | const formType = ref<'create' | 'update'>('create'); | ||||||
|  | const supplierId = ref<number>(); | ||||||
|  | 
 | ||||||
|  | const [Form, formApi] = useVbenForm({ | ||||||
|  |   commonConfig: { | ||||||
|  |     componentProps: { | ||||||
|  |       class: 'w-full', | ||||||
|  |     }, | ||||||
|  |     labelWidth: 100, | ||||||
|  |   }, | ||||||
|  |   wrapperClass: 'grid-cols-2', | ||||||
|  |   layout: 'horizontal', | ||||||
|  |   schema: useFormSchema(), | ||||||
|  |   showDefaultActions: false, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const [Modal, modalApi] = useVbenModal({ | ||||||
|  |   async onConfirm() { | ||||||
|  |     const { valid } = await formApi.validate(); | ||||||
|  |     if (!valid) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     modalApi.lock(); | ||||||
|  |     // 提交表单 | ||||||
|  |     const data = (await formApi.getValues()) as ErpSupplierApi.Supplier; | ||||||
|  |     try { | ||||||
|  |       if (formType.value === 'create') { | ||||||
|  |         await createSupplier(data); | ||||||
|  |         message.success($t('ui.actionMessage.createSuccess')); | ||||||
|  |       } else { | ||||||
|  |         await updateSupplier(data); | ||||||
|  |         message.success($t('ui.actionMessage.updateSuccess')); | ||||||
|  |       } | ||||||
|  |       // 关闭并提示 | ||||||
|  |       await modalApi.close(); | ||||||
|  |       emit('success'); | ||||||
|  |     } finally { | ||||||
|  |       modalApi.unlock(); | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   async onOpenChange(isOpen: boolean) { | ||||||
|  |     if (!isOpen) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     // 加载数据 | ||||||
|  |     const data = modalApi.getData<{ id?: number; type: 'create' | 'update' }>(); | ||||||
|  |     if (!data) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     formType.value = data.type; | ||||||
|  |     supplierId.value = data.id; | ||||||
|  | 
 | ||||||
|  |     modalApi.lock(); | ||||||
|  |     try { | ||||||
|  |       if (data.type === 'update' && data.id) { | ||||||
|  |         // 编辑模式,加载数据 | ||||||
|  |         const supplierData = await getSupplier(data.id); | ||||||
|  |         await formApi.setValues(supplierData); | ||||||
|  |       } else { | ||||||
|  |         // 新增模式,重置表单 | ||||||
|  |         await formApi.resetFields(); | ||||||
|  |       } | ||||||
|  |     } finally { | ||||||
|  |       modalApi.unlock(); | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | defineExpose({ | ||||||
|  |   modalApi, | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <template> | ||||||
|  |   <Modal | ||||||
|  |     :title="formType === 'create' ? '新增供应商' : '编辑供应商'" | ||||||
|  |     class="w-2/5" | ||||||
|  |   > | ||||||
|  |     <Form class="mx-4" /> | ||||||
|  |   </Modal> | ||||||
|  | </template> | ||||||
		Loading…
	
		Reference in New Issue
	
	 nehc
						nehc