import { ref } from 'vue'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
export function useCrudPage({
|
createEmptyModel,
|
buildEditModel,
|
buildSavePayload,
|
saveRequest,
|
updateRequest,
|
deleteRequest,
|
entityName,
|
resolveRecordLabel,
|
refreshCreate,
|
refreshUpdate,
|
refreshRemove
|
}) {
|
const dialogVisible = ref(false)
|
const dialogType = ref('add')
|
const currentRecord = ref(createEmptyModel())
|
const selectedRows = ref([])
|
|
const resetCurrentRecord = () => {
|
currentRecord.value = createEmptyModel()
|
}
|
|
const handleSelectionChange = (rows) => {
|
selectedRows.value = Array.isArray(rows) ? rows : []
|
}
|
|
const showDialog = (type, record) => {
|
dialogType.value = type
|
currentRecord.value = type === 'edit' ? buildEditModel(record) : createEmptyModel()
|
dialogVisible.value = true
|
}
|
|
const closeDialog = () => {
|
dialogVisible.value = false
|
resetCurrentRecord()
|
}
|
|
const handleDialogSubmit = async (formData) => {
|
const payload = buildSavePayload(formData)
|
try {
|
if (dialogType.value === 'edit') {
|
await updateRequest(payload)
|
ElMessage.success('修改成功')
|
closeDialog()
|
await refreshUpdate?.()
|
return
|
}
|
|
await saveRequest(payload)
|
ElMessage.success('新增成功')
|
closeDialog()
|
await refreshCreate?.()
|
} catch (error) {
|
ElMessage.error(error?.message || '提交失败')
|
}
|
}
|
|
const handleDelete = async (record) => {
|
try {
|
const recordLabel = resolveRecordLabel?.(record) || record?.id
|
await ElMessageBox.confirm(`确定要删除${entityName}「${recordLabel}」吗?`, '删除确认', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
})
|
await deleteRequest(record.id)
|
ElMessage.success('删除成功')
|
await refreshRemove?.()
|
} catch (error) {
|
if (error !== 'cancel') {
|
ElMessage.error(error?.message || '删除失败')
|
}
|
}
|
}
|
|
const handleBatchDelete = async () => {
|
if (!selectedRows.value.length) return
|
const ids = selectedRows.value
|
.map((item) => item.id)
|
.filter((id) => id !== void 0 && id !== null)
|
if (!ids.length) return
|
|
try {
|
await ElMessageBox.confirm(`确定要批量删除选中的 ${ids.length} 个${entityName}吗?`, '批量删除确认', {
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning'
|
})
|
await deleteRequest(ids.join(','))
|
ElMessage.success('批量删除成功')
|
selectedRows.value = []
|
await refreshRemove?.()
|
} catch (error) {
|
if (error !== 'cancel') {
|
ElMessage.error(error?.message || '批量删除失败')
|
}
|
}
|
}
|
|
return {
|
dialogVisible,
|
dialogType,
|
currentRecord,
|
selectedRows,
|
handleSelectionChange,
|
showDialog,
|
closeDialog,
|
handleDialogSubmit,
|
handleDelete,
|
handleBatchDelete
|
}
|
}
|