index.vue.blt 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <script setup lang="ts">
  2. import AForm from '@/components/AForm/index.vue'
  3. import { FormConfigType } from '@/components/AForm/type'
  4. import { ToolbarConfigType } from '@/components/AToolbar/type'
  5. import { ColumnConfigType } from '@/components/ATable/type'
  6. import { StrAnyObj, StrAnyObjArr } from '@/typings'
  7. import { useHandleData } from '@/utils/useHandleData'
  8. import { getPageApi, getDetailApi, addApi, editApi, deleteApi } from '@/api/business/${tablePrefix}/${tableSuffix}'
  9. const queryRef = ref<InstanceType<typeof AForm>>()
  10. const formRef = ref<InstanceType<typeof AForm>>()
  11. const showQuery = ref<boolean>(true)
  12. const selectKeys = ref<string[]>([])
  13. const pageTotal = ref<number>(0)
  14. const queryData = ref<StrAnyObj>({ pageNum: 1, pageSize: 10 })
  15. const tableData = ref<StrAnyObjArr>([])
  16. const formData = ref<StrAnyObj>({})
  17. const dialogTitle = ref<string>('')
  18. const dialogVisible = ref<boolean>(false)
  19. const queryConfig: FormConfigType[] = [
  20. <% for(field in table.fields){ %>
  21. {
  22. type: 'input',
  23. prop: '${field.propertyName}',
  24. label: '${field.comment}'
  25. },
  26. <% } %>
  27. ]
  28. const toolbarConfig: ToolbarConfigType[] = [
  29. {
  30. common: 'search',
  31. click() {
  32. queryData.value.pageNum = 1
  33. getPage()
  34. }
  35. },
  36. {
  37. common: 'reset',
  38. click() {
  39. queryRef.value?.resetFields()
  40. getPage()
  41. }
  42. },
  43. {
  44. common: 'add',
  45. click() {
  46. dialogVisible.value = true
  47. dialogTitle.value = '新增'
  48. }
  49. },
  50. {
  51. common: 'delete',
  52. disabled() {
  53. return selectKeys.value.length == 0
  54. },
  55. click() {
  56. handleRemove(selectKeys.value)
  57. }
  58. }
  59. ]
  60. const columnConfig: ColumnConfigType[] = [
  61. <% for(field in table.fields){ %>
  62. {
  63. prop: '${field.propertyName}',
  64. label: '${field.comment}'
  65. },
  66. <% } %>
  67. {
  68. width: 250,
  69. handleConfig: [
  70. {
  71. common: 'update',
  72. click(row) {
  73. dialogVisible.value = true
  74. dialogTitle.value = '编辑'
  75. getDetailApi({ id: row.id }).then((resp: StrAnyObj) => {
  76. formData.value = resp
  77. })
  78. }
  79. },
  80. {
  81. common: 'delete',
  82. click(row) {
  83. handleRemove([row.id])
  84. }
  85. }
  86. ]
  87. }
  88. ]
  89. const formConfig: FormConfigType[] = [
  90. <% for(field in table.fields){ %>
  91. {
  92. type: 'input',
  93. prop: '${field.propertyName}',
  94. label: '${field.comment}',
  95. rule: [{ required: true, message: '${field.comment}不能为空', trigger: 'blur' }]
  96. },
  97. <% } %>
  98. ]
  99. onMounted(() => {
  100. getPage()
  101. })
  102. function getPage() {
  103. getPageApi(queryData.value).then((resp) => {
  104. tableData.value = resp.rows
  105. pageTotal.value = resp.total
  106. })
  107. }
  108. function tableSelectionChange(item: StrAnyObjArr) {
  109. selectKeys.value = item.map((item) => item.id)
  110. }
  111. function formSubmit() {
  112. formRef.value?.validate(() => {
  113. if (formData.value.id) {
  114. editApi(formData.value).then(() => {
  115. dialogVisible.value = false
  116. ElMessage.success('修改成功')
  117. getPage()
  118. })
  119. } else {
  120. addApi(formData.value).then(() => {
  121. dialogVisible.value = false
  122. ElMessage.success('新增成功')
  123. getPage()
  124. })
  125. }
  126. })
  127. }
  128. function formClosed() {
  129. formRef.value?.resetFields()
  130. }
  131. function handleRemove(idList: string[]) {
  132. useHandleData('是否确认删除?', () => {
  133. deleteApi({ idList }).then(() => {
  134. ElMessage.success('删除成功')
  135. getPage()
  136. })
  137. })
  138. }
  139. </script>
  140. <template>
  141. <div>
  142. <el-card v-if="showQuery">
  143. <a-form ref="queryRef" v-model="queryData" :config="queryConfig" :span="6"> </a-form>
  144. </el-card>
  145. <a-table
  146. selection
  147. :data="tableData"
  148. :page-total="pageTotal"
  149. :toolbar-config="toolbarConfig"
  150. :column-config="columnConfig"
  151. v-model:showQuery="showQuery"
  152. v-model:page-num="queryData.pageNum"
  153. v-model:page-size="queryData.pageSize"
  154. @page-num-change="getPage"
  155. @page-size-change="getPage"
  156. @selection-change="tableSelectionChange"
  157. >
  158. </a-table>
  159. <a-dialog
  160. v-model="dialogVisible"
  161. :title="dialogTitle"
  162. @submit="formSubmit"
  163. @closed="formClosed"
  164. >
  165. <a-form ref="formRef" v-model="formData" :config="formConfig" :span="24"> </a-form>
  166. </a-dialog>
  167. </div>
  168. </template>