mirror of
				https://gitee.com/hhyykk/ipms-sjy-ui.git
				synced 2025-11-01 02:38:44 +08:00 
			
		
		
		
	vue3 重构:邮件账号的列表 + 搜索
This commit is contained in:
		| @@ -1,10 +1,12 @@ | |||||||
| import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas' | import { CrudSchema, useCrudSchemas } from '@/hooks/web/useCrudSchemas' | ||||||
|  | import { DictTag } from '@/components/DictTag' | ||||||
|  | import { TableColumn } from '@/types/table' | ||||||
|  | import { dateFormatter } from '@/utils/formatTime' | ||||||
|  |  | ||||||
| const { t } = useI18n() // 国际化 | const { t } = useI18n() // 国际化 | ||||||
|  |  | ||||||
| // 表单校验 | // 表单校验 | ||||||
| export const rules = reactive({ | export const rules = reactive({ | ||||||
|   // mail: [required], |  | ||||||
|   mail: [ |   mail: [ | ||||||
|     { required: true, message: t('profile.rules.mail'), trigger: 'blur' }, |     { required: true, message: t('profile.rules.mail'), trigger: 'blur' }, | ||||||
|     { |     { | ||||||
| @@ -21,34 +23,28 @@ export const rules = reactive({ | |||||||
| }) | }) | ||||||
|  |  | ||||||
| // CrudSchema | // CrudSchema | ||||||
| const crudSchemas = reactive<VxeCrudSchema>({ | const crudSchemas = reactive<CrudSchema[]>([ | ||||||
|   primaryKey: 'id', // 默认的主键 ID |  | ||||||
|   primaryTitle: '编号', |  | ||||||
|   primaryType: 'id', |  | ||||||
|   action: true, |  | ||||||
|   actionWidth: '200', // 3 个按钮默认 200,如有删减对应增减即可 |  | ||||||
|   columns: [ |  | ||||||
|   { |   { | ||||||
|       title: '邮箱', |     label: '邮箱', | ||||||
|     field: 'mail', |     field: 'mail', | ||||||
|     isSearch: true |     isSearch: true | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: '用户名', |     label: '用户名', | ||||||
|     field: 'username', |     field: 'username', | ||||||
|     isSearch: true |     isSearch: true | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: '密码', |     label: '密码', | ||||||
|     field: 'password', |     field: 'password', | ||||||
|     isTable: false |     isTable: false | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: 'SMTP 服务器域名', |     label: 'SMTP 服务器域名', | ||||||
|     field: 'host' |     field: 'host' | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: 'SMTP 服务器端口', |     label: 'SMTP 服务器端口', | ||||||
|     field: 'port', |     field: 'port', | ||||||
|     form: { |     form: { | ||||||
|       component: 'InputNumber', |       component: 'InputNumber', | ||||||
| @@ -56,20 +52,20 @@ const crudSchemas = reactive<VxeCrudSchema>({ | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: '是否开启 SSL', |     label: '是否开启 SSL', | ||||||
|     field: 'sslEnable', |     field: 'sslEnable', | ||||||
|       dictType: DICT_TYPE.INFRA_BOOLEAN_STRING, |     formatter: (_: Recordable, __: TableColumn, cellValue: boolean) => { | ||||||
|       dictClass: 'boolean' |       return h(DictTag, { | ||||||
|  |         type: DICT_TYPE.INFRA_BOOLEAN_STRING, | ||||||
|  |         value: cellValue | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|       title: '创建时间', |     label: '创建时间', | ||||||
|     field: 'createTime', |     field: 'createTime', | ||||||
|     isForm: false, |     isForm: false, | ||||||
|       formatter: 'formatDate', |     formatter: dateFormatter | ||||||
|       table: { |  | ||||||
|         width: 180 |  | ||||||
|   } |   } | ||||||
|     } | ]) | ||||||
|   ] | export const { allSchemas } = useCrudSchemas(crudSchemas) | ||||||
| }) |  | ||||||
| export const { allSchemas } = useVxeCrudSchemas(crudSchemas) |  | ||||||
|   | |||||||
| @@ -1,151 +1,40 @@ | |||||||
| <template> | <template> | ||||||
|   <ContentWrap> |   <ContentWrap> | ||||||
|     <!-- 列表 --> |     <Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" /> | ||||||
|     <XTable @register="registerTable"> |  | ||||||
|       <template #toolbar_buttons> |  | ||||||
|         <!-- 操作:新增 --> |  | ||||||
|         <XButton |  | ||||||
|           type="primary" |  | ||||||
|           preIcon="ep:zoom-in" |  | ||||||
|           :title="t('action.add')" |  | ||||||
|           v-hasPermi="['system:mail-account:create']" |  | ||||||
|           @click="handleCreate()" |  | ||||||
|         /> |  | ||||||
|       </template> |  | ||||||
|       <template #actionbtns_default="{ row }"> |  | ||||||
|         <!-- 操作:修改 --> |  | ||||||
|         <XTextButton |  | ||||||
|           preIcon="ep:edit" |  | ||||||
|           :title="t('action.edit')" |  | ||||||
|           v-hasPermi="['system:mail-account:update']" |  | ||||||
|           @click="handleUpdate(row.id)" |  | ||||||
|         /> |  | ||||||
|         <!-- 操作:详情 --> |  | ||||||
|         <XTextButton |  | ||||||
|           preIcon="ep:view" |  | ||||||
|           :title="t('action.detail')" |  | ||||||
|           v-hasPermi="['system:mail-account:query']" |  | ||||||
|           @click="handleDetail(row.id)" |  | ||||||
|         /> |  | ||||||
|         <!-- 操作:删除 --> |  | ||||||
|         <XTextButton |  | ||||||
|           preIcon="ep:delete" |  | ||||||
|           :title="t('action.del')" |  | ||||||
|           v-hasPermi="['system:mail-account:delete']" |  | ||||||
|           @click="deleteData(row.id)" |  | ||||||
|         /> |  | ||||||
|       </template> |  | ||||||
|     </XTable> |  | ||||||
|   </ContentWrap> |   </ContentWrap> | ||||||
|   <!-- 弹窗 --> |  | ||||||
|   <XModal id="mailAccountModel" :loading="modelLoading" v-model="modelVisible" :title="modelTitle"> |   <ContentWrap> | ||||||
|     <!-- 表单:添加/修改 --> |     <Table | ||||||
|     <Form |       v-model:pageSize="tableObject.pageSize" | ||||||
|       ref="formRef" |       v-model:currentPage="tableObject.currentPage" | ||||||
|       v-if="['create', 'update'].includes(actionType)" |       :columns="allSchemas.tableColumns" | ||||||
|       :schema="allSchemas.formSchema" |       :data="tableObject.tableList" | ||||||
|       :rules="rules" |       :loading="tableObject.loading" | ||||||
|     /> |       :pagination="{ | ||||||
|     <!-- 表单:详情 --> |         total: tableObject.total | ||||||
|     <Descriptions |       }" | ||||||
|       v-if="actionType === 'detail'" |       @register="register" | ||||||
|       :schema="allSchemas.detailSchema" |     > | ||||||
|       :data="detailData" |       <template #action="{ row }"> | ||||||
|     /> |         <ElButton type="danger" @click="delData(row, false)"> | ||||||
|     <template #footer> |           {{ t('exampleDemo.del') }} | ||||||
|       <!-- 按钮:保存 --> |         </ElButton> | ||||||
|       <XButton |  | ||||||
|         v-if="['create', 'update'].includes(actionType)" |  | ||||||
|         type="primary" |  | ||||||
|         :title="t('action.save')" |  | ||||||
|         :loading="actionLoading" |  | ||||||
|         @click="submitForm()" |  | ||||||
|       /> |  | ||||||
|       <!-- 按钮:关闭 --> |  | ||||||
|       <XButton :loading="actionLoading" :title="t('dialog.close')" @click="modelVisible = false" /> |  | ||||||
|       </template> |       </template> | ||||||
|   </XModal> |     </Table> | ||||||
|  |   </ContentWrap> | ||||||
| </template> | </template> | ||||||
| <script setup lang="ts" name="MailAccount"> | <script setup lang="ts" name="MailAccount"> | ||||||
| import { FormExpose } from '@/components/Form' | import { allSchemas } from './account.data' | ||||||
| // 业务相关的 import | import { useTable } from '@/hooks/web/useTable' | ||||||
| import { rules, allSchemas } from './account.data' | import { Table } from '@/components/Table' | ||||||
| import * as MailAccountApi from '@/api/system/mail/account' | import * as MailAccountApi from '@/api/system/mail/account' | ||||||
|  |  | ||||||
| const { t } = useI18n() // 国际化 | const { register, tableObject, methods } = useTable<MailAccountApi.MailAccountVO>({ | ||||||
| const message = useMessage() // 消息弹窗 |  | ||||||
|  |  | ||||||
| // 列表相关的变量 |  | ||||||
| const [registerTable, { reload, deleteData }] = useXTable({ |  | ||||||
|   allSchemas: allSchemas, |  | ||||||
|   getListApi: MailAccountApi.getMailAccountPageApi, |   getListApi: MailAccountApi.getMailAccountPageApi, | ||||||
|   deleteApi: MailAccountApi.deleteMailAccountApi |   delListApi: MailAccountApi.deleteMailAccountApi | ||||||
| }) | }) | ||||||
|  |  | ||||||
| // 弹窗相关的变量 | const { getList, setSearchParams } = methods | ||||||
| const modelVisible = ref(false) // 是否显示弹出层 |  | ||||||
| const modelTitle = ref('edit') // 弹出层标题 |  | ||||||
| const modelLoading = ref(false) // 弹出层loading |  | ||||||
| const actionType = ref('') // 操作按钮的类型 |  | ||||||
| const actionLoading = ref(false) // 按钮 Loading |  | ||||||
| const formRef = ref<FormExpose>() // 表单 Ref |  | ||||||
| const detailData = ref() // 详情 Ref |  | ||||||
|  |  | ||||||
| // 设置标题 | getList() | ||||||
| const setDialogTile = (type: string) => { |  | ||||||
|   modelLoading.value = true |  | ||||||
|   modelTitle.value = t('action.' + type) |  | ||||||
|   actionType.value = type |  | ||||||
|   modelVisible.value = true |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 新增操作 |  | ||||||
| const handleCreate = () => { |  | ||||||
|   setDialogTile('create') |  | ||||||
|   modelLoading.value = false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 修改操作 |  | ||||||
| const handleUpdate = async (rowId: number) => { |  | ||||||
|   setDialogTile('update') |  | ||||||
|   // 设置数据 |  | ||||||
|   const res = await MailAccountApi.getMailAccountApi(rowId) |  | ||||||
|   unref(formRef)?.setValues(res) |  | ||||||
|   modelLoading.value = false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 详情操作 |  | ||||||
| const handleDetail = async (rowId: number) => { |  | ||||||
|   setDialogTile('detail') |  | ||||||
|   const res = await MailAccountApi.getMailAccountApi(rowId) |  | ||||||
|   detailData.value = res |  | ||||||
|   modelLoading.value = false |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // 提交按钮 |  | ||||||
| const submitForm = async () => { |  | ||||||
|   const elForm = unref(formRef)?.getElFormRef() |  | ||||||
|   if (!elForm) return |  | ||||||
|   elForm.validate(async (valid) => { |  | ||||||
|     if (valid) { |  | ||||||
|       actionLoading.value = true |  | ||||||
|       // 提交请求 |  | ||||||
|       try { |  | ||||||
|         const data = unref(formRef)?.formModel as MailAccountApi.MailAccountVO |  | ||||||
|         if (actionType.value === 'create') { |  | ||||||
|           await MailAccountApi.createMailAccountApi(data) |  | ||||||
|           message.success(t('common.createSuccess')) |  | ||||||
|         } else { |  | ||||||
|           await MailAccountApi.updateMailAccountApi(data) |  | ||||||
|           message.success(t('common.updateSuccess')) |  | ||||||
|         } |  | ||||||
|         modelVisible.value = false |  | ||||||
|       } finally { |  | ||||||
|         actionLoading.value = false |  | ||||||
|         // 刷新列表 |  | ||||||
|         await reload() |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
| </script> | </script> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV