index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <template>
  2. <!-- 搜索工作栏 -->
  3. <ContentWrap>
  4. <el-form
  5. ref="queryFormRef"
  6. :inline="true"
  7. :model="queryParams"
  8. class="-mb-15px"
  9. label-width="68px"
  10. >
  11. <el-form-item label="分组名称" prop="groupName">
  12. <el-input
  13. v-model="queryParams.groupName"
  14. class="!w-240px"
  15. clearable
  16. placeholder="请输入分组名称"
  17. @keyup.enter="handleQuery"
  18. />
  19. </el-form-item>
  20. <el-form-item>
  21. <el-button @click="handleQuery">
  22. <Icon class="mr-5px" icon="ep:search" />
  23. 搜索
  24. </el-button>
  25. <el-button @click="resetQuery">
  26. <Icon class="mr-5px" icon="ep:refresh" />
  27. 重置
  28. </el-button>
  29. <el-button plain type="primary" @click="openForm('create')">
  30. <Icon class="mr-5px" icon="ep:plus" />
  31. 新增
  32. </el-button>
  33. </el-form-item>
  34. </el-form>
  35. </ContentWrap>
  36. <!-- 列表 -->
  37. <ContentWrap>
  38. <el-table v-loading="loading" :data="list" style="width: 100%">
  39. <!-- <el-table-column label="ID" align="center" prop="id" width="80" /> -->
  40. <el-table-column label="分组名称" align="center" prop="groupName" />
  41. <el-table-column label="排序" align="center" prop="sort" />
  42. <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
  43. <el-table-column label="创建时间" align="center" prop="createTime">
  44. <template #default="scope">
  45. {{ formatDate(scope.row.createTime) }}
  46. </template>
  47. </el-table-column>
  48. <el-table-column label="操作" align="center" width="150" fixed="right">
  49. <template #default="scope">
  50. <el-button link type="primary" @click="openForm('update', scope.row)"> 编辑 </el-button>
  51. <el-button link type="danger" @click="handleDelete(scope.row.id)"> 删除 </el-button>
  52. </template>
  53. </el-table-column>
  54. </el-table>
  55. <!-- 分页 (可选,根据实际需求添加) -->
  56. <Pagination
  57. :total="total"
  58. v-model:page="queryParams.pageNo"
  59. v-model:limit="queryParams.pageSize"
  60. @pagination="getList"
  61. />
  62. </ContentWrap>
  63. <!-- 表单弹窗:添加/修改 -->
  64. <el-dialog
  65. v-model="dialogVisible"
  66. :title="dialogTitle"
  67. width="500px"
  68. append-to-body
  69. @closed="handleDialogClosed"
  70. >
  71. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="100px">
  72. <el-form-item label="分组名称" prop="groupName">
  73. <el-input v-model="formData.groupName" placeholder="请输入分组名称" />
  74. </el-form-item>
  75. <el-form-item label="排序" prop="sort">
  76. <el-input-number
  77. v-model="formData.sort"
  78. :min="0"
  79. controls-position="right"
  80. class="!w-100%"
  81. />
  82. </el-form-item>
  83. <el-form-item label="备注" prop="remark">
  84. <el-input v-model="formData.remark" type="textarea" placeholder="请输入备注" />
  85. </el-form-item>
  86. </el-form>
  87. <template #footer>
  88. <el-button @click="dialogVisible = false">取 消</el-button>
  89. <el-button type="primary" @click="submitForm" :loading="submitLoading"> 确 定 </el-button>
  90. </template>
  91. </el-dialog>
  92. </template>
  93. <script setup>
  94. import { ref, reactive, onMounted } from 'vue'
  95. import { ElMessage, ElMessageBox } from 'element-plus'
  96. import { Icon } from '@/components/Icon'
  97. // 假设你有这些工具组件,如果没有请根据实际情况调整
  98. import Pagination from '@/components/Pagination/index.vue'
  99. import { formatDate } from '@/utils/formatTime'
  100. import { createGroup, getGroupList, updateGroup, deleteGroup } from '@/api/flow'
  101. // --- 响应式数据 ---
  102. const loading = ref(false)
  103. const list = ref([])
  104. const total = ref(0)
  105. const queryParams = reactive({
  106. pageNo: 1,
  107. pageSize: 10,
  108. groupName: undefined
  109. })
  110. const queryFormRef = ref(null)
  111. // 表单相关
  112. const dialogVisible = ref(false)
  113. const dialogTitle = ref('')
  114. const formRef = ref(null)
  115. const submitLoading = ref(false)
  116. const formData = reactive({
  117. groupName: '',
  118. sort: 0,
  119. remark: ''
  120. })
  121. const formRules = reactive({
  122. groupName: [{ required: true, message: '请输入分组名称', trigger: 'blur' }],
  123. sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
  124. })
  125. // --- 方法 ---
  126. const getList = async () => {
  127. loading.value = true
  128. console.log('queryParams>>>>>>>>>>>>>>>>>..', queryParams)
  129. try {
  130. const res = await getGroupList(queryParams)
  131. list.value = res.list
  132. total.value = res.total
  133. } catch (error) {
  134. console.error(error)
  135. } finally {
  136. loading.value = false
  137. }
  138. }
  139. const handleQuery = () => {
  140. queryParams.pageNo = 1
  141. getList()
  142. }
  143. const resetQuery = () => {
  144. queryFormRef.value?.resetFields()
  145. handleQuery()
  146. }
  147. const openForm = (type, row) => {
  148. dialogVisible.value = true
  149. dialogTitle.value = type === 'create' ? '新增分组' : '编辑分组'
  150. if (type === 'create') {
  151. formData.groupName = ''
  152. formData.sort = 0
  153. formData.remark = ''
  154. } else {
  155. // 编辑模式:深拷贝,避免直接修改表格数据
  156. Object.assign(formData, JSON.parse(JSON.stringify(row)))
  157. }
  158. // 清除校验状态
  159. formRef.value?.clearValidate()
  160. }
  161. // 对话框关闭时重置表单
  162. const handleDialogClosed = () => {
  163. formRef.value?.resetFields()
  164. }
  165. const submitForm = async () => {
  166. if (!formRef.value) return
  167. await formRef.value.validate(async (valid) => {
  168. if (valid) {
  169. submitLoading.value = true
  170. try {
  171. const submitData = { ...formData }
  172. if (formData.id) {
  173. await updateGroup(submitData)
  174. ElMessage.success('修改成功')
  175. } else {
  176. await createGroup(submitData)
  177. ElMessage.success('新增成功')
  178. }
  179. dialogVisible.value = false
  180. await getList()
  181. } catch (error) {
  182. console.error(error)
  183. } finally {
  184. submitLoading.value = false
  185. }
  186. }
  187. })
  188. }
  189. const handleDelete = async (id) => {
  190. try {
  191. await ElMessageBox.confirm('确定要删除该项吗?', '提示', {
  192. confirmButtonText: '确定',
  193. cancelButtonText: '取消',
  194. type: 'warning'
  195. })
  196. await deleteGroup(id)
  197. ElMessage.success('删除成功')
  198. await getList()
  199. } catch (error) {
  200. // ignore
  201. }
  202. }
  203. onMounted(() => {
  204. getList()
  205. })
  206. </script>
  207. <style scoped></style>