index.vue 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <div class="main animate__animated animate__backInRight" v-loading="loading">
  3. <custom-search-bar :fields="fields.filter((f) => f.isSearch)" v-model="searchForm" @search="search" @reset="toReset"></custom-search-bar>
  4. <custom-button-bar :fields="buttonFields" @add="toAdd"></custom-button-bar>
  5. <custom-table :data="data" :fields="fields" @query="search" :total="total" :opera="opera" @edit="toEdit" @delete="toDelete" :select="true"> </custom-table>
  6. <el-dialog v-model="dialog" title="数据维护信息" :destroy-on-close="false" @close="toClose" width="50%">
  7. <custom-form v-model="form" :fields="fields" :rules="{}" @save="toSave"> </custom-form>
  8. </el-dialog>
  9. </div>
  10. </template>
  11. <script setup>
  12. const $checkRes = inject('$checkRes')
  13. import { cloneDeep, get } from 'lodash-es'
  14. const { t } = useI18n()
  15. // 接口
  16. import { NodeStore } from '@/store/api/core/node'
  17. const store = NodeStore()
  18. const data = ref([])
  19. const searchForm = ref({})
  20. const fields = [
  21. { label: '节点名称', model: 'name', isSearch: true },
  22. { label: '节点类型', model: 'type' },
  23. { label: 'CPU已用/总数', model: 'cpu_num' },
  24. { label: 'GPU已用/总数', model: 'gpu_num' },
  25. { label: '分区', model: 'partition' },
  26. { label: '运行状态', model: 'status' },
  27. { label: '当前作业数', model: 'work_num' }
  28. ]
  29. const opera = [
  30. { label: t('common.update'), method: 'edit' },
  31. { label: t('common.delete'), method: 'delete', confirm: true, type: 'danger' }
  32. ]
  33. const buttonFields = [{ label: t('common.add'), method: 'add' }]
  34. let skip = 0
  35. let limit = inject('limit')
  36. const total = ref(20)
  37. // 加载中
  38. const loading = ref(false)
  39. const dialog = ref(false)
  40. const form = ref({})
  41. // 请求
  42. onMounted(async () => {
  43. loading.value = true
  44. await search({ skip, limit })
  45. loading.value = false
  46. })
  47. const search = async (query = { skip: 0, limit }) => {
  48. const info = { skip: query.skip, limit: query.limit, ...searchForm.value }
  49. const res = await store.query(info)
  50. if (res.errcode == '0') {
  51. data.value = res.data.data
  52. total.value = res.data.total
  53. }
  54. }
  55. // 添加
  56. const toAdd = () => {
  57. dialog.value = true
  58. }
  59. // 修改
  60. const toEdit = (data) => {
  61. form.value = data
  62. dialog.value = true
  63. }
  64. // 删除
  65. const toDelete = async (data) => {
  66. const res = await store.del(data._id)
  67. if ($checkRes(res, true)) {
  68. search({ skip: 0, limit })
  69. }
  70. }
  71. const toSave = async () => {
  72. const data = cloneDeep(form.value)
  73. let res
  74. if (get(data, '_id')) res = await store.update(data)
  75. else res = await store.create({ ...data })
  76. if ($checkRes(res, true)) {
  77. search({ skip: 0, limit })
  78. toClose()
  79. }
  80. }
  81. // 重置
  82. const toReset = async () => {
  83. searchForm.value = {}
  84. await search({ skip, limit })
  85. }
  86. const toClose = () => {
  87. form.value = {}
  88. dialog.value = false
  89. }
  90. </script>
  91. <style scoped lang="scss"></style>