|
|
@@ -1,8 +1,9 @@
|
|
|
<script setup lang="ts">
|
|
|
-import { ElMessage, ElMessageBox, type FormProps } from 'element-plus'
|
|
|
-import type { PropType } from 'vue'
|
|
|
-import type { AdvancedForm, BasicForm, BasicFormItem } from '@/types/form'
|
|
|
import router from '@/router'
|
|
|
+import { ElMessage, ElMessageBox, type DialogProps } from 'element-plus'
|
|
|
+import type { PropType } from 'vue'
|
|
|
+import type { AdvancedForm, BasicForm } from '@/types/form'
|
|
|
+import type { TableProps } from 'element-plus/es/components/table/src/table/defaults'
|
|
|
|
|
|
interface CRUD {
|
|
|
create: Function
|
|
|
@@ -11,6 +12,11 @@ interface CRUD {
|
|
|
getList: Function
|
|
|
getRecord: Function
|
|
|
}
|
|
|
+interface CustomTable {
|
|
|
+ showOperate: boolean
|
|
|
+}
|
|
|
+type Table = Partial<Omit<TableProps<any>, 'data'> & CustomTable>
|
|
|
+
|
|
|
const props = defineProps({
|
|
|
crud: {
|
|
|
required: true,
|
|
|
@@ -24,17 +30,21 @@ const props = defineProps({
|
|
|
type: Boolean,
|
|
|
default: true
|
|
|
},
|
|
|
- form: {
|
|
|
+ formConfig: {
|
|
|
type: Object as PropType<BasicForm | AdvancedForm>,
|
|
|
required: true
|
|
|
- }
|
|
|
+ },
|
|
|
+ dialogConfig: {
|
|
|
+ type: Object as PropType<DialogProps>
|
|
|
+ },
|
|
|
+ tableConfig: Object as PropType<Table>
|
|
|
})
|
|
|
|
|
|
// ============== 查询部分开始 ===============
|
|
|
const query = ref<any>({})
|
|
|
const searchList = ref<any>([])
|
|
|
watch(
|
|
|
- () => props.form.formItems,
|
|
|
+ () => props.formConfig.formItems,
|
|
|
val => {
|
|
|
val.forEach((item: any) => {
|
|
|
if (item.group) {
|
|
|
@@ -43,7 +53,6 @@ watch(
|
|
|
item.search && searchList.value.push(item)
|
|
|
}
|
|
|
})
|
|
|
- console.log(searchList.value)
|
|
|
},
|
|
|
{ immediate: true }
|
|
|
)
|
|
|
@@ -55,21 +64,20 @@ const handleQuery = () => {
|
|
|
const handleReset = () => {
|
|
|
query.value = {}
|
|
|
}
|
|
|
-const placeholder = (item: BasicFormItem) => {
|
|
|
- if (['select'].includes(item.type)) {
|
|
|
- return '请选择' + item.label
|
|
|
- } else {
|
|
|
- return '请输入' + item.label
|
|
|
- }
|
|
|
-}
|
|
|
// ============== 查询部分结束 ===============
|
|
|
|
|
|
// ============== 表格部分开始 ===============
|
|
|
const tableData = ref([])
|
|
|
const total = ref(0)
|
|
|
const curPage = ref(1)
|
|
|
+const loading = ref(false)
|
|
|
+const tableConfig = ref<Table>({
|
|
|
+ showOperate: true,
|
|
|
+ ...props.tableConfig
|
|
|
+})
|
|
|
|
|
|
const getTableData = () => {
|
|
|
+ loading.value = true
|
|
|
props.crud
|
|
|
?.getList({
|
|
|
...query.value,
|
|
|
@@ -80,6 +88,9 @@ const getTableData = () => {
|
|
|
tableData.value = res.data
|
|
|
total.value = res.total
|
|
|
})
|
|
|
+ .finally(() => {
|
|
|
+ loading.value = false
|
|
|
+ })
|
|
|
}
|
|
|
getTableData()
|
|
|
|
|
|
@@ -94,7 +105,7 @@ const handleSelectionChange = (columns: any[]) => {
|
|
|
// ============== 表格部分结束 ===============
|
|
|
|
|
|
// ============== crud部分开始 ===============
|
|
|
-const formRoute = props.form.route
|
|
|
+const formRoute = props.formConfig.route
|
|
|
const handleCreate = () => {
|
|
|
if (formRoute) {
|
|
|
router.push(formRoute)
|
|
|
@@ -121,23 +132,37 @@ const handleDelete = (id: string | number) => {
|
|
|
ElMessageBox.confirm('您确定要删除该项吗', '提示', {
|
|
|
type: 'warning'
|
|
|
}).then(async () => {
|
|
|
- const res = await props.crud?.delete(id)
|
|
|
- if (res.code === 0) {
|
|
|
- ElMessage({
|
|
|
- type: 'success',
|
|
|
- message: '删除成功'
|
|
|
- })
|
|
|
- }
|
|
|
+ await props.crud?.delete({ id })
|
|
|
+ ElMessage({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+const handlePatchDelete = () => {
|
|
|
+ ElMessageBox.confirm('您确定要删除吗', '提示', {
|
|
|
+ type: 'warning'
|
|
|
+ }).then(async () => {
|
|
|
+ await props.crud?.delete({
|
|
|
+ ids: multipleSelection.value.map(item => item.id).join(',')
|
|
|
+ })
|
|
|
+ ElMessage({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ })
|
|
|
})
|
|
|
}
|
|
|
-const handlePatchDelete = () => {}
|
|
|
// ============== crud部分结束 ===============
|
|
|
|
|
|
// ============== 表单部分开始 ===============
|
|
|
const formData = ref<any>({})
|
|
|
const dialogVisible = ref(false)
|
|
|
-
|
|
|
// ============== 表单部分结束 ===============
|
|
|
+
|
|
|
+defineExpose({
|
|
|
+ handleDelete,
|
|
|
+ handleUpdate
|
|
|
+})
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
@@ -164,10 +189,16 @@ const dialogVisible = ref(false)
|
|
|
</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <el-table class="flex-grow-1 h-full" :data="tableData" @selection-change="handleSelectionChange">
|
|
|
+ <el-table
|
|
|
+ class="flex-grow-1 h-full"
|
|
|
+ :data="tableData"
|
|
|
+ @selection-change="handleSelectionChange"
|
|
|
+ v-loading="loading"
|
|
|
+ v-bind="tableConfig"
|
|
|
+ >
|
|
|
<el-table-column type="selection" width="50" v-if="selection"></el-table-column>
|
|
|
<slot></slot>
|
|
|
- <el-table-column fixed="right" label="操作" width="120">
|
|
|
+ <el-table-column fixed="right" label="操作" width="120" v-if="tableConfig?.showOperate">
|
|
|
<template #default="{ row }">
|
|
|
<el-button link type="primary" size="small" @click="handleUpdate(row)">编辑</el-button>
|
|
|
<el-button link type="danger" size="small" @click="handleDelete(row.id)">删除</el-button>
|
|
|
@@ -189,7 +220,8 @@ const dialogVisible = ref(false)
|
|
|
|
|
|
<dialog-form
|
|
|
v-model="dialogVisible"
|
|
|
- :form="form"
|
|
|
+ :dialogConfig="dialogConfig"
|
|
|
+ :formConfig="formConfig"
|
|
|
:formData="formData"
|
|
|
:create="crud.create"
|
|
|
:update="crud.update"
|