TaskView.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <template>
  2. <ElCard shadow="never" ref="el">
  3. <template #header>
  4. <div class="flex items-center">
  5. <span>任务</span>
  6. <ElButton class="ml-4" type="primary" @click="emit('createTask')">新建任务</ElButton>
  7. <div class="flex-1"></div>
  8. <ElIcon @click="refresh" class="cursor-pointer" :class="{ iloading: loading }">
  9. <RotateClockwise />
  10. </ElIcon>
  11. </div>
  12. </template>
  13. <PagingTable url="/tasks" ref="pt" :height="tableHeight">
  14. <ElTableColumn prop="id" label="ID" width="50" />
  15. <ElTableColumn prop="createdAt" label="创建时间" :formatter="timeFormatter" width="150" />
  16. <ElTableColumn prop="startTime" label="执行时间" :formatter="timeFormatter" width="150" />
  17. <ElTableColumn prop="type" label="任务类型" show-overflow-tooltip>
  18. <template #default="{ row }">
  19. {{ row.items.map((i) => i.type).join(' ,') }}
  20. </template>
  21. </ElTableColumn>
  22. <ElTableColumn prop="status" label="状态" align="center" width="120">
  23. <template #default="{ row }">
  24. <ElTag v-if="row.status === 'pending'" type="info">未开始</ElTag>
  25. <ElTag v-if="row.status === 'in_progress'" type="success">执行中</ElTag>
  26. <ElTag v-if="row.status === 'done'" type="">已完成</ElTag>
  27. </template>
  28. </ElTableColumn>
  29. <ElTableColumn prop="progress" label="进度" :formatter="progressFormatter" width="100" />
  30. <ElTableColumn label="操作" align="center" width="100">
  31. <template #default="{ row }">
  32. <ElButton @click="delTask(row)" type="danger" :disabled="row.status === 'in_progress'"
  33. >删除</ElButton
  34. >
  35. </template>
  36. </ElTableColumn>
  37. </PagingTable>
  38. </ElCard>
  39. </template>
  40. <script setup>
  41. import { ref, inject, computed } from 'vue'
  42. import PagingTable from '@/components/PagingTable.vue'
  43. import { useTimeFormatter, useEnumFormatter } from '@/utils/formatter'
  44. import { TaskType } from '@/enums'
  45. import { useIntervalFn, useElementSize } from '@vueuse/core'
  46. import { RotateClockwise } from '@vicons/tabler'
  47. import { ElMessage, ElMessageBox } from 'element-plus'
  48. import { http } from '@/plugins/http'
  49. const emit = defineEmits(['createTask'])
  50. const timeFormatter = useTimeFormatter('yyyy-MM-dd HH:mm:ss')
  51. const taskTypeFormatter = useEnumFormatter(TaskType)
  52. const pt = ref(null)
  53. useIntervalFn(() => {
  54. pt.value && pt.value.refresh()
  55. }, 2000)
  56. function progressFormatter(row, column, value, index) {
  57. return `${value + 1}/${row.accounts.length * row.items.length}`
  58. }
  59. const loading = ref(false)
  60. function refresh() {
  61. pt.value && pt.value.refresh()
  62. loading.value = true
  63. setTimeout(() => {
  64. loading.value = false
  65. }, 1000)
  66. }
  67. const el = ref(null)
  68. const { width, height } = useElementSize(el)
  69. const tableHeight = computed(() => {
  70. return height.value - 105
  71. })
  72. async function delTask(row) {
  73. try {
  74. await ElMessageBox.confirm('此操作将永久删除该任务, 是否继续?', '提示', {
  75. confirmButtonText: '确定',
  76. cancelButtonText: '取消',
  77. type: 'warning'
  78. })
  79. await http.delete(`/tasks/${row.id}`)
  80. refresh()
  81. } catch (error) {
  82. if ('cancel' === error) return
  83. ElMessage.error(error.message)
  84. }
  85. }
  86. </script>