Browse Source

perf: 重构post

xingyu 2 years ago
parent
commit
d2805b1dca

+ 93 - 0
yudao-ui-admin-vue3/src/views/system/post/PostModal.vue

@@ -0,0 +1,93 @@
+<template>
+  <!-- 弹窗 -->
+  <XModal id="postModel" :loading="modelLoading" v-model="modelVisible" :title="modelTitle">
+    <!-- 表单:添加/修改 -->
+    <Form
+      ref="formRef"
+      v-if="['create', 'update'].includes(actionType)"
+      :schema="allSchemas.formSchema"
+      :rules="rules"
+    />
+    <!-- 表单:详情 -->
+    <Descriptions
+      v-if="actionType === 'detail'"
+      :schema="allSchemas.detailSchema"
+      :data="detailData"
+    />
+    <template #footer>
+      <!-- 按钮:保存 -->
+      <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>
+  </XModal>
+</template>
+<script setup lang="ts">
+import type { FormExpose } from '@/components/Form'
+import * as PostApi from '@/api/system/post'
+import { rules, allSchemas } from './post.data'
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const emit = defineEmits(['success', 'openModal'])
+
+// 弹窗相关的变量
+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
+
+const openModal = async (type: string, rowId?: number) => {
+  modelLoading.value = true
+  modelTitle.value = t('action.' + type)
+  actionType.value = type
+  modelVisible.value = true
+  // 设置数据
+  if (rowId) {
+    const res = await PostApi.getPostApi(rowId)
+    if (type === 'update') {
+      unref(formRef)?.setValues(res)
+    } else if (type === 'detail') {
+      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 PostApi.PostVO
+        if (actionType.value === 'create') {
+          await PostApi.createPostApi(data)
+          message.success(t('common.createSuccess'))
+        } else {
+          await PostApi.updatePostApi(data)
+          message.success(t('common.updateSuccess'))
+        }
+        modelVisible.value = false
+      } finally {
+        actionLoading.value = false
+        emit('success')
+      }
+    }
+  })
+}
+
+defineExpose({ openModal: openModal })
+</script>

+ 11 - 82
yudao-ui-admin-vue3/src/views/system/post/index.vue

@@ -9,7 +9,7 @@
           preIcon="ep:zoom-in"
           :title="t('action.add')"
           v-hasPermi="['system:post:create']"
-          @click="openModel('create')"
+          @click="openModal('create')"
         />
         <!-- 操作:导出 -->
         <XButton
@@ -25,13 +25,13 @@
         <XTextButton
           preIcon="ep:edit"
           v-hasPermi="['system:post:update']"
-          @click="openModel('update', row.id)"
+          @click="openModal('update', row.id)"
         />
         <!-- 操作:详情 -->
         <XTextButton
           preIcon="ep:view"
           v-hasPermi="['system:post:query']"
-          @click="openModel('detail', row.id)"
+          @click="openModal('detail', row.id)"
         />
         <!-- 操作:删除 -->
         <XTextButton
@@ -42,43 +42,16 @@
       </template>
     </XTable>
   </ContentWrap>
-  <!-- 弹窗 -->
-  <XModal id="postModel" :loading="modelLoading" v-model="modelVisible" :title="modelTitle">
-    <!-- 表单:添加/修改 -->
-    <Form
-      ref="formRef"
-      v-if="['create', 'update'].includes(actionType)"
-      :schema="allSchemas.formSchema"
-      :rules="rules"
-    />
-    <!-- 表单:详情 -->
-    <Descriptions
-      v-if="actionType === 'detail'"
-      :schema="allSchemas.detailSchema"
-      :data="detailData"
-    />
-    <template #footer>
-      <!-- 按钮:保存 -->
-      <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>
-  </XModal>
+  <PostModal ref="modalRef" @success="success" />
 </template>
 <script setup lang="ts" name="Post">
-import type { FormExpose } from '@/components/Form'
 // 业务相关的 import
 import * as PostApi from '@/api/system/post'
-import { rules, allSchemas } from './post.data'
+import { allSchemas } from './post.data'
+import PostModal from './PostModal.vue'
 
 const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
+const modalRef = ref()
 // 列表相关的变量
 const [registerTable, { reload, deleteData, exportList }] = useXTable({
   allSchemas: allSchemas,
@@ -86,56 +59,12 @@ const [registerTable, { reload, deleteData, exportList }] = useXTable({
   deleteApi: PostApi.deletePostApi,
   exportListApi: PostApi.exportPostApi
 })
-// 弹窗相关的变量
-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
 
-const openModel = async (type: string, rowId?: number) => {
-  modelLoading.value = true
-  modelTitle.value = t('action.' + type)
-  actionType.value = type
-  modelVisible.value = true
-  // 设置数据
-  if (rowId) {
-    const res = await PostApi.getPostApi(rowId)
-    if (type === 'update') {
-      unref(formRef)?.setValues(res)
-    } else if (type === 'detail') {
-      detailData.value = res
-    }
-  }
-  modelLoading.value = false
+const openModal = (type: string, rowId?: number) => {
+  modalRef.value.openModal(type, rowId)
 }
 
-// 提交新增/修改的表单
-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 PostApi.PostVO
-        if (actionType.value === 'create') {
-          await PostApi.createPostApi(data)
-          message.success(t('common.createSuccess'))
-        } else {
-          await PostApi.updatePostApi(data)
-          message.success(t('common.updateSuccess'))
-        }
-        modelVisible.value = false
-      } finally {
-        actionLoading.value = false
-        // 刷新列表
-        reload()
-      }
-    }
-  })
+const success = () => {
+  reload()
 }
 </script>