commit
						932797405b
					
				|  | @ -0,0 +1,63 @@ | ||||||
|  | import type { PageParam } from '@vben/request'; | ||||||
|  | 
 | ||||||
|  | import { requestClient } from '#/api/request'; | ||||||
|  | 
 | ||||||
|  | export namespace SystemTenantApi { | ||||||
|  |   /** | ||||||
|  |    * 租户信息 | ||||||
|  |    */ | ||||||
|  |   export interface SystemTenant { | ||||||
|  |     id?: number; | ||||||
|  |     name: string; | ||||||
|  |     packageId: number; | ||||||
|  |     contactName: string; | ||||||
|  |     contactMobile: string; | ||||||
|  |     accountCount: number; | ||||||
|  |     expireTime: Date; | ||||||
|  |     website: string; | ||||||
|  |     status: number; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * 租户列表 | ||||||
|  |  */ | ||||||
|  | export function getTenantPage(params: PageParam) { | ||||||
|  |   return requestClient.get('/system/tenant/page', { params }); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 获取租户精简信息列表 */ | ||||||
|  | export function getSimpleTenantList() { | ||||||
|  |   return requestClient.get<SystemTenantApi.SystemTenant[]>( | ||||||
|  |     '/system/tenant/simple-list', | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 查询租户详情 */ | ||||||
|  | export function getTenant(id: number) { | ||||||
|  |   return requestClient.get<SystemTenantApi.SystemTenant>( | ||||||
|  |     `/system/tenant/get?id=${id}`, | ||||||
|  |   ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 新增租户 */ | ||||||
|  | export function createTenant(data: SystemTenantApi.SystemTenant) { | ||||||
|  |   return requestClient.post('/system/tenant/create', data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 修改租户 */ | ||||||
|  | export function updateTenant(data: SystemTenantApi.SystemTenant) { | ||||||
|  |   return requestClient.put('/system/tenant/update', data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 删除租户 */ | ||||||
|  | export function deleteTenant(id: number) { | ||||||
|  |   return requestClient.delete(`/system/tenant/delete?id=${id}`); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 导出租户 */ | ||||||
|  | export function exportTenant(params: any) { | ||||||
|  |   return requestClient.download('/system/tenant/export-excel', { | ||||||
|  |     params, | ||||||
|  |   }); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,63 @@ | ||||||
|  | import type { PageParam, PageResult } from '@vben/request'; | ||||||
|  | 
 | ||||||
|  | import { requestClient } from '#/api/request'; | ||||||
|  | 
 | ||||||
|  | export namespace SystemTenantPackageApi { | ||||||
|  |   /** | ||||||
|  |    * 租户套餐信息 | ||||||
|  |    */ | ||||||
|  |   export interface SystemTenantPackage { | ||||||
|  |     id: number; | ||||||
|  |     name: string; | ||||||
|  |     status: number; | ||||||
|  |     remark: string; | ||||||
|  |     creator: string; | ||||||
|  |     updater: string; | ||||||
|  |     updateTime: string; | ||||||
|  |     menuIds: number[]; | ||||||
|  |     createTime: Date; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * 租户套餐列表 | ||||||
|  |  */ | ||||||
|  | export function getTenantPackagePage(params: PageParam) { | ||||||
|  |   return requestClient.get< | ||||||
|  |     PageResult<SystemTenantPackageApi.SystemTenantPackage> | ||||||
|  |   >('/system/tenant-package/page', params); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 查询租户套餐详情 */ | ||||||
|  | export function getTenantPackage(id: number) { | ||||||
|  |   return requestClient.get(`/system/TenantPackage/get?id=${id}`); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 新增租户套餐 */ | ||||||
|  | export function createTenantPackage( | ||||||
|  |   data: SystemTenantPackageApi.SystemTenantPackage, | ||||||
|  | ) { | ||||||
|  |   return requestClient.post('/system/TenantPackage/create', data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 修改租户套餐 */ | ||||||
|  | export function updateTenantPackage( | ||||||
|  |   data: SystemTenantPackageApi.SystemTenantPackage, | ||||||
|  | ) { | ||||||
|  |   return requestClient.put('/system/TenantPackage/update', data); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 删除租户套餐 */ | ||||||
|  | export function deleteTenantPackage(id: number) { | ||||||
|  |   return requestClient.delete(`/system/TenantPackage/delete?id=${id}`); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 获取租户套餐精简信息列表
 | ||||||
|  | export function getTenantPackageList() { | ||||||
|  |   return requestClient.get('/system/tenant-package/get-simple-list'); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 导出租户套餐 */ | ||||||
|  | export function exportTenantPackage(params: any) { | ||||||
|  |   return requestClient.download('/system/TenantPackage/export', params); | ||||||
|  | } | ||||||
|  | @ -0,0 +1,234 @@ | ||||||
|  | import type { VbenFormSchema } from '#/adapter/form'; | ||||||
|  | import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; | ||||||
|  | import type { SystemTenantApi } from '#/api/system/tenant'; | ||||||
|  | 
 | ||||||
|  | import { z } from '#/adapter/form'; | ||||||
|  | import { getTenantPackageList } from '#/api/system/tenantPackage'; | ||||||
|  | import { CommonStatusEnum } from '#/utils/constants'; | ||||||
|  | import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | ||||||
|  | 
 | ||||||
|  | /** 新增、修改表单 */ | ||||||
|  | export function useFormSchema(): VbenFormSchema[] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       fieldName: 'id', | ||||||
|  |       component: 'Input', | ||||||
|  |       dependencies: { | ||||||
|  |         triggerFields: [''], | ||||||
|  |         show: () => false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       fieldName: 'name', | ||||||
|  |       label: '租户名称', | ||||||
|  |       rules: 'required', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'ApiSelect', | ||||||
|  |       fieldName: 'packageId', | ||||||
|  |       label: '租户套餐', | ||||||
|  |       rules: 'required', | ||||||
|  |       componentProps: { | ||||||
|  |         api: () => getTenantPackageList(), | ||||||
|  |         class: 'w-full', | ||||||
|  |         labelField: 'name', | ||||||
|  |         valueField: 'id', | ||||||
|  |         placeholder: '请选择租户套餐', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       fieldName: 'contactName', | ||||||
|  |       label: '联系人', | ||||||
|  |       rules: 'required', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       fieldName: 'contactMobile', | ||||||
|  |       label: '联系手机', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       label: '用户名称', | ||||||
|  |       fieldName: 'username', | ||||||
|  |       rules: 'required', | ||||||
|  |       dependencies: { | ||||||
|  |         triggerFields: ['id'], | ||||||
|  |         show: (values) => !values.id, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       label: '用户密码', | ||||||
|  |       fieldName: 'password', | ||||||
|  |       component: 'InputPassword', | ||||||
|  |       rules: 'required', | ||||||
|  |       dependencies: { | ||||||
|  |         triggerFields: ['id'], | ||||||
|  |         show: (values) => !values.id, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'InputNumber', | ||||||
|  |       label: '账号额度', | ||||||
|  |       fieldName: 'accountCount', | ||||||
|  |       rules: 'required', | ||||||
|  |       defaultValue: 0, | ||||||
|  |       componentProps: { | ||||||
|  |         class: 'w-full', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'DatePicker', | ||||||
|  |       label: '过期时间', | ||||||
|  |       fieldName: 'expireTime', | ||||||
|  |       rules: 'required', | ||||||
|  |       componentProps: { | ||||||
|  |         showTime: true, | ||||||
|  |         format: 'YYYY-MM-DD HH:mm:ss', | ||||||
|  |         valueFormat: 'x', | ||||||
|  |         class: 'w-full', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       component: 'Input', | ||||||
|  |       label: '绑定域名', | ||||||
|  |       fieldName: 'website', | ||||||
|  |       rules: 'required', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'status', | ||||||
|  |       label: '租户状态', | ||||||
|  |       component: 'RadioGroup', | ||||||
|  |       componentProps: { | ||||||
|  |         options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), | ||||||
|  |         buttonStyle: 'solid', | ||||||
|  |         optionType: 'button', | ||||||
|  |       }, | ||||||
|  |       rules: z.number().default(CommonStatusEnum.ENABLE), | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 列表的搜索表单 */ | ||||||
|  | export function useGridFormSchema(): VbenFormSchema[] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       fieldName: 'name', | ||||||
|  |       label: '租户名', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         allowClear: true, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'contactName', | ||||||
|  |       label: '联系人', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         allowClear: true, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'contactMobile', | ||||||
|  |       label: '联系手机', | ||||||
|  |       component: 'Input', | ||||||
|  |       componentProps: { | ||||||
|  |         allowClear: true, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'status', | ||||||
|  |       label: '状态', | ||||||
|  |       component: 'Select', | ||||||
|  |       componentProps: { | ||||||
|  |         allowClear: true, | ||||||
|  |         options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       fieldName: 'createTime', | ||||||
|  |       label: '创建时间', | ||||||
|  |       component: 'RangePicker', | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 列表的字段 */ | ||||||
|  | export function useGridColumns<T = SystemTenantApi.SystemTenant>( | ||||||
|  |   onActionClick: OnActionClickFn<T>, | ||||||
|  | ): VxeTableGridOptions['columns'] { | ||||||
|  |   return [ | ||||||
|  |     { | ||||||
|  |       field: 'id', | ||||||
|  |       title: '租户编号', | ||||||
|  |       minWidth: 200, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'name', | ||||||
|  |       title: '租户名', | ||||||
|  |       minWidth: 200, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'packageId', | ||||||
|  |       title: '租户套餐', | ||||||
|  |       minWidth: 200, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'contactName', | ||||||
|  |       title: '联系人', | ||||||
|  |       minWidth: 100, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'contactMobile', | ||||||
|  |       title: '联系手机', | ||||||
|  |       minWidth: 200, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'accountCount', | ||||||
|  |       title: '账号额度', | ||||||
|  |       minWidth: 100, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'expireTime', | ||||||
|  |       title: '过期时间', | ||||||
|  |       minWidth: 180, | ||||||
|  |       formatter: 'formatDateTime', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'website', | ||||||
|  |       title: '绑定域名', | ||||||
|  |       minWidth: 180, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'status', | ||||||
|  |       title: '租户状态', | ||||||
|  |       minWidth: 100, | ||||||
|  |       cellRender: { | ||||||
|  |         name: 'CellDict', | ||||||
|  |         props: { type: DICT_TYPE.COMMON_STATUS }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'createTime', | ||||||
|  |       title: '创建时间', | ||||||
|  |       minWidth: 180, | ||||||
|  |       formatter: 'formatDateTime', | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       field: 'operation', | ||||||
|  |       title: '操作', | ||||||
|  |       minWidth: 130, | ||||||
|  |       align: 'center', | ||||||
|  |       fixed: 'right', | ||||||
|  |       cellRender: { | ||||||
|  |         attrs: { | ||||||
|  |           nameField: 'name', | ||||||
|  |           nameTitle: '租户', | ||||||
|  |           onClick: onActionClick, | ||||||
|  |         }, | ||||||
|  |         name: 'CellOperation', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,127 @@ | ||||||
|  | <script lang="ts" setup> | ||||||
|  | import type { | ||||||
|  |   OnActionClickParams, | ||||||
|  |   VxeTableGridOptions, | ||||||
|  | } from '#/adapter/vxe-table'; | ||||||
|  | import type { SystemTenantApi } from '#/api/system/tenant'; | ||||||
|  | 
 | ||||||
|  | import { Page, useVbenModal } from '@vben/common-ui'; | ||||||
|  | 
 | ||||||
|  | import { Button, message } from 'ant-design-vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenVxeGrid } from '#/adapter/vxe-table'; | ||||||
|  | import { deleteTenant, exportTenant, getTenantPage } from '#/api/system/tenant'; | ||||||
|  | import { $t } from '#/locales'; | ||||||
|  | import { downloadByData } from '#/utils/download'; | ||||||
|  | 
 | ||||||
|  | import { useGridColumns, useGridFormSchema } from './data'; | ||||||
|  | import Form from './modules/form.vue'; | ||||||
|  | 
 | ||||||
|  | const [FormModal, formModalApi] = useVbenModal({ | ||||||
|  |   connectedComponent: Form, | ||||||
|  |   destroyOnClose: true, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | /** 刷新表格 */ | ||||||
|  | function onRefresh() { | ||||||
|  |   gridApi.query(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 导出表格 */ | ||||||
|  | async function onExport() { | ||||||
|  |   const data = await exportTenant(await gridApi.formApi.getValues()); | ||||||
|  |   downloadByData(data, '租户.xls'); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 创建租户 */ | ||||||
|  | function onCreate() { | ||||||
|  |   formModalApi.setData(null).open(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 编辑租户 */ | ||||||
|  | function onEdit(row: SystemTenantApi.SystemTenant) { | ||||||
|  |   formModalApi.setData(row).open(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 删除租户 */ | ||||||
|  | async function onDelete(row: SystemTenantApi.SystemTenant) { | ||||||
|  |   const hideLoading = message.loading({ | ||||||
|  |     content: $t('ui.actionMessage.deleting', [row.name]), | ||||||
|  |     duration: 0, | ||||||
|  |     key: 'action_process_msg', | ||||||
|  |   }); | ||||||
|  |   try { | ||||||
|  |     await deleteTenant(row.id as number); | ||||||
|  |     message.success({ | ||||||
|  |       content: $t('ui.actionMessage.deleteSuccess', [row.name]), | ||||||
|  |       key: 'action_process_msg', | ||||||
|  |     }); | ||||||
|  |     onRefresh(); | ||||||
|  |   } catch { | ||||||
|  |     hideLoading(); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** 表格操作按钮的回调函数 */ | ||||||
|  | function onActionClick({ | ||||||
|  |   code, | ||||||
|  |   row, | ||||||
|  | }: OnActionClickParams<SystemTenantApi.SystemTenant>) { | ||||||
|  |   switch (code) { | ||||||
|  |     case 'delete': { | ||||||
|  |       onDelete(row); | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |     case 'edit': { | ||||||
|  |       onEdit(row); | ||||||
|  |       break; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const [Grid, gridApi] = useVbenVxeGrid({ | ||||||
|  |   formOptions: { | ||||||
|  |     schema: useGridFormSchema(), | ||||||
|  |   }, | ||||||
|  |   gridOptions: { | ||||||
|  |     columns: useGridColumns(onActionClick), | ||||||
|  |     height: 'auto', | ||||||
|  |     keepSource: true, | ||||||
|  |     proxyConfig: { | ||||||
|  |       ajax: { | ||||||
|  |         query: async ({ page }, formValues) => { | ||||||
|  |           return await getTenantPage({ | ||||||
|  |             pageNo: page.currentPage, | ||||||
|  |             pageSize: page.pageSize, | ||||||
|  |             ...formValues, | ||||||
|  |           }); | ||||||
|  |         }, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     rowConfig: { | ||||||
|  |       keyField: 'id', | ||||||
|  |     }, | ||||||
|  |     toolbarConfig: { | ||||||
|  |       refresh: { code: 'query' }, | ||||||
|  |       search: true, | ||||||
|  |     }, | ||||||
|  |   } as VxeTableGridOptions<SystemTenantApi.SystemTenant>, | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | <template> | ||||||
|  |   <Page auto-content-height> | ||||||
|  |     <FormModal @success="onRefresh" /> | ||||||
|  |     <Grid table-title="租户列表"> | ||||||
|  |       <template #toolbar-tools> | ||||||
|  |         <Button type="primary" @click="onCreate"> | ||||||
|  |           <Plus class="size-5" /> | ||||||
|  |           {{ $t('ui.actionTitle.create', ['租户']) }} | ||||||
|  |         </Button> | ||||||
|  |         <Button type="primary" class="ml-2" @click="onExport"> | ||||||
|  |           <Download class="size-5" /> | ||||||
|  |           {{ $t('ui.actionTitle.export') }} | ||||||
|  |         </Button> | ||||||
|  |       </template> | ||||||
|  |     </Grid> | ||||||
|  |   </Page> | ||||||
|  | </template> | ||||||
|  | @ -0,0 +1,76 @@ | ||||||
|  | <script lang="ts" setup> | ||||||
|  | import type { SystemTenantApi } from '#/api/system/tenant'; | ||||||
|  | 
 | ||||||
|  | import { computed, ref } from 'vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenModal } from '@vben/common-ui'; | ||||||
|  | 
 | ||||||
|  | import { message } from 'ant-design-vue'; | ||||||
|  | 
 | ||||||
|  | import { useVbenForm } from '#/adapter/form'; | ||||||
|  | import { createTenant, getTenant, updateTenant } from '#/api/system/tenant'; | ||||||
|  | import { $t } from '#/locales'; | ||||||
|  | 
 | ||||||
|  | import { useFormSchema } from '../data'; | ||||||
|  | 
 | ||||||
|  | const emit = defineEmits(['success']); | ||||||
|  | const formData = ref<SystemTenantApi.SystemTenant>(); | ||||||
|  | const getTitle = computed(() => { | ||||||
|  |   return formData.value | ||||||
|  |     ? $t('ui.actionTitle.edit', ['租户']) | ||||||
|  |     : $t('ui.actionTitle.create', ['租户']); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const [Form, formApi] = useVbenForm({ | ||||||
|  |   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 SystemTenantApi.SystemTenant; | ||||||
|  |     try { | ||||||
|  |       await (formData.value ? updateTenant(data) : createTenant(data)); | ||||||
|  |       // 关闭并提示 | ||||||
|  |       await modalApi.close(); | ||||||
|  |       emit('success'); | ||||||
|  |       message.success({ | ||||||
|  |         content: $t('ui.actionMessage.operationSuccess'), | ||||||
|  |         key: 'action_process_msg', | ||||||
|  |       }); | ||||||
|  |     } finally { | ||||||
|  |       modalApi.lock(false); | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   async onOpenChange(isOpen) { | ||||||
|  |     if (!isOpen) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     // 加载数据 | ||||||
|  |     const data = modalApi.getData<SystemTenantApi.SystemTenant>(); | ||||||
|  |     if (!data || !data.id) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     modalApi.lock(); | ||||||
|  |     try { | ||||||
|  |       formData.value = await getTenant(data.id as number); | ||||||
|  |       // 设置到 values | ||||||
|  |       await formApi.setValues(formData.value); | ||||||
|  |     } finally { | ||||||
|  |       modalApi.lock(false); | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | <template> | ||||||
|  |   <Modal :title="getTitle"> | ||||||
|  |     <Form class="mx-4" /> | ||||||
|  |   </Modal> | ||||||
|  | </template> | ||||||
		Loading…
	
		Reference in New Issue
	
	 芋道源码
						芋道源码