classification-management.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. <script setup>
  2. import { reactive, ref, watch } from "vue"
  3. import { getCategoryImagePage, addCategoryImage, updateCategoryImage, deleteCategoryImage } from "@/api/alumniAlbum"
  4. import { ElMessage, ElMessageBox } from "element-plus"
  5. import { usePagination } from "@/hooks/usePagination"
  6. import { cloneDeep } from "lodash-es"
  7. const loading = ref(false)
  8. const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
  9. //#region 增
  10. const DEFAULT_FORM_DATA = {
  11. id: undefined,
  12. name: ""
  13. }
  14. const dialogVisible = ref(false)
  15. const formRef = ref(null)
  16. const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
  17. const formRules = {
  18. name: [{ required: true, trigger: "blur", message: "必填" }]
  19. }
  20. const handleCreateOrUpdate = () => {
  21. formRef.value?.validate((valid, fields) => {
  22. if (!valid) return console.error("表单校验不通过", fields)
  23. loading.value = true
  24. const api = formData.value.id === undefined ? addCategoryImage : updateCategoryImage
  25. api(formData.value)
  26. .then(() => {
  27. ElMessage.success("操作成功")
  28. dialogVisible.value = false
  29. getTableData()
  30. })
  31. .catch(() => {
  32. loading.value = false
  33. })
  34. })
  35. }
  36. const resetForm = () => {
  37. formRef.value?.clearValidate()
  38. formData.value = cloneDeep(DEFAULT_FORM_DATA)
  39. }
  40. //#endregion
  41. //#region 删
  42. const handleDelete = (row) => {
  43. ElMessageBox.confirm("确认删除?", "提示", {
  44. confirmButtonText: "确定",
  45. cancelButtonText: "取消",
  46. type: "warning"
  47. }).then(() => {
  48. deleteCategoryImage(row.id).then(() => {
  49. ElMessage.success("删除成功")
  50. getTableData()
  51. })
  52. })
  53. }
  54. //#endregion
  55. //#region 改
  56. const handleUpdate = (row) => {
  57. dialogVisible.value = true
  58. formData.value = cloneDeep(row)
  59. }
  60. //#endregion
  61. //#region 查
  62. const tableData = ref([])
  63. const searchFormRef = ref(null)
  64. const searchData = reactive({
  65. createTime: null
  66. })
  67. const getTableData = () => {
  68. loading.value = true
  69. getCategoryImagePage({
  70. currentPage: paginationData.currentPage,
  71. pageCount: paginationData.pageSize,
  72. startTime: searchData.createTime ? searchData.createTime[0] : undefined,
  73. endTime: searchData.createTime ? searchData.createTime[1] : undefined
  74. })
  75. .then(({ data }) => {
  76. // console.log(data)
  77. paginationData.total = data.totalCount
  78. tableData.value = data.list
  79. })
  80. .catch(() => {
  81. tableData.value = []
  82. })
  83. .finally(() => {
  84. loading.value = false
  85. })
  86. }
  87. const handleSearch = () => {
  88. paginationData.currentPage === 1 ? getTableData() : (paginationData.currentPage = 1)
  89. }
  90. const resetSearch = () => {
  91. searchFormRef.value?.resetFields()
  92. handleSearch()
  93. }
  94. //#endregion
  95. /** 监听分页参数的变化 */
  96. watch([() => paginationData.currentPage, () => paginationData.pageSize], getTableData, { immediate: true })
  97. </script>
  98. <template>
  99. <div class="app-container">
  100. <el-card v-loading="loading" header="分类管理">
  101. <div class="toolbar-wrapper">
  102. <el-form ref="searchFormRef" :inline="true" :model="searchData">
  103. <el-form-item prop="createTime" label="创建时间">
  104. <el-date-picker
  105. v-model="searchData.createTime"
  106. type="datetimerange"
  107. start-placeholder="开始时间"
  108. end-placeholder="结束时间"
  109. value-format="YYYY-MM-DD HH:mm:ss"
  110. />
  111. </el-form-item>
  112. <el-form-item>
  113. <el-button type="primary" @click="handleSearch">查询</el-button>
  114. <el-button @click="resetSearch" plain>重置</el-button>
  115. </el-form-item>
  116. </el-form>
  117. <div>
  118. <el-button type="primary" @click="dialogVisible = true">创建分类</el-button>
  119. </div>
  120. </div>
  121. <div class="table-wrapper">
  122. <el-table :data="tableData" max-height="500">
  123. <el-table-column type="index" label="序号" width="100" align="center" />
  124. <el-table-column prop="name" label="分类名称" align="center" />
  125. <el-table-column prop="createTime" label="创建时间" align="center" />
  126. <el-table-column prop="createUser" label="创建人" align="center" />
  127. <el-table-column fixed="right" label="操作" width="200" align="center">
  128. <template #default="scope">
  129. <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
  130. <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
  131. </template>
  132. </el-table-column>
  133. </el-table>
  134. </div>
  135. <div class="pager-wrapper">
  136. <el-pagination
  137. background
  138. :layout="paginationData.layout"
  139. :page-sizes="paginationData.pageSizes"
  140. :total="paginationData.total"
  141. :page-size="paginationData.pageSize"
  142. :currentPage="paginationData.currentPage"
  143. @size-change="handleSizeChange"
  144. @current-change="handleCurrentChange"
  145. />
  146. </div>
  147. </el-card>
  148. <!-- 新增/修改 -->
  149. <el-dialog
  150. v-model="dialogVisible"
  151. :title="formData.id === undefined ? '创建分类' : '编辑分类'"
  152. @closed="resetForm"
  153. width="50%"
  154. >
  155. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="auto" size="large">
  156. <el-form-item prop="name" label="分类名称">
  157. <el-input v-model="formData.name" placeholder="请输入" />
  158. </el-form-item>
  159. </el-form>
  160. <template #footer>
  161. <el-button @click="dialogVisible = false">取消</el-button>
  162. <el-button type="primary" @click="handleCreateOrUpdate" :loading="loading">立即创建</el-button>
  163. </template>
  164. </el-dialog>
  165. </div>
  166. </template>
  167. <style lang="scss" scoped>
  168. .toolbar-wrapper {
  169. margin-bottom: 26px;
  170. }
  171. .table-wrapper {
  172. margin-bottom: 29px;
  173. .el-link {
  174. margin-right: 15px;
  175. }
  176. }
  177. .pager-wrapper {
  178. display: flex;
  179. justify-content: flex-end;
  180. }
  181. </style>