index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <template>
  2. <div class="task-container">
  3. <a-form layout="inline" :model="queryParam">
  4. <a-form-item label="年级:">
  5. <a-select style="min-width: 150px" v-model:value="queryParam.gradeLevel" allowClear placeholder="年级">
  6. <a-select-option v-for="item in levelEnum" :key="item.key" :value="item.key">
  7. {{ item.value }}
  8. </a-select-option>
  9. </a-select>
  10. </a-form-item>
  11. <a-form-item>
  12. <a-button type="primary" @click="submitForm">查询</a-button>
  13. <a-button style="margin-left: 20px" type="primary" @click="createTask">创建任务</a-button>
  14. </a-form-item>
  15. </a-form>
  16. <a-table
  17. :loading="listLoading"
  18. :data-source="tableData"
  19. :pagination="false"
  20. row-key="id"
  21. bordered
  22. style="margin-top: 16px"
  23. >
  24. <a-table-column title="Id" dataIndex="id" key="id" width="100" />
  25. <a-table-column title="标题" dataIndex="title" key="title" />
  26. <!-- <a-table-column title="学级" dataIndex="gradeLevel" key="gradeLevel" :customRender="levelFormatter" /> -->
  27. <a-table-column title="发送人" dataIndex="createUserName" key="createUserName" width="100" />
  28. <a-table-column title="创建时间" dataIndex="createTime" key="createTime" width="160">
  29. <template #default="{ record }">
  30. {{ formatDateTime(record.createTime) }}
  31. </template>
  32. </a-table-column>
  33. <a-table-column title="操作" key="action" align="center" width="160">
  34. <template #default="{ record }">
  35. <a-button size="small" @click="editTask(record)">编辑</a-button>
  36. <a-button size="small" danger style="margin-left: 8px" @click="deleteTask(record)">删除</a-button>
  37. </template>
  38. </a-table-column>
  39. </a-table>
  40. <a-pagination
  41. v-show="total > 0"
  42. :total="total"
  43. :current="queryParam.pageIndex"
  44. :pageSize="queryParam.pageSize"
  45. @change="onPageChange"
  46. @showSizeChange="onPageSizeChange"
  47. :showSizeChanger="true"
  48. :pageSizeOptions="['10', '20', '50', '100']"
  49. style="margin-top: 16px; text-align: right"
  50. />
  51. <a-drawer
  52. :visible="drawerVisible"
  53. :title="drawerTitle"
  54. placement="right"
  55. width="900"
  56. @close="closeDrawer"
  57. destroyOnClose
  58. >
  59. <TaskEdit v-if="drawerVisible" :id="editId" @success="onEditSuccess" />
  60. </a-drawer>
  61. </div>
  62. </template>
  63. <script setup>
  64. import { ref, reactive, onMounted } from 'vue'
  65. import { message, Modal } from 'ant-design-vue'
  66. import taskApi from '@/api/exam/paper/task.js'
  67. import TaskEdit from './form.vue'
  68. import { useExamStore } from '@/store/exam.js'
  69. import { storeToRefs } from 'pinia'
  70. import { parseTime } from '@/utils/exam'
  71. const examStore = useExamStore()
  72. const { levelEnum, enumFormat } = storeToRefs(examStore)
  73. const drawerVisible = ref(false)
  74. const drawerTitle = ref('')
  75. const editId = ref(null)
  76. const queryParam = reactive({
  77. gradeLevel: null,
  78. pageIndex: 1,
  79. pageSize: 10
  80. })
  81. const listLoading = ref(false)
  82. const tableData = ref([])
  83. const total = ref(0)
  84. const fetchList = async () => {
  85. listLoading.value = true
  86. try {
  87. const params = {
  88. ...queryParam,
  89. current: queryParam.pageIndex,
  90. size: queryParam.pageSize
  91. }
  92. delete params.pageIndex
  93. delete params.pageSize
  94. const data = await taskApi.pageList(params)
  95. tableData.value = data.records || []
  96. total.value = data.total || 0
  97. queryParam.pageIndex = data.current || 1
  98. } finally {
  99. listLoading.value = false
  100. }
  101. }
  102. onMounted(() => {
  103. fetchList()
  104. })
  105. const submitForm = () => {
  106. queryParam.pageIndex = 1
  107. fetchList()
  108. }
  109. const onPageChange = (page, pageSize) => {
  110. queryParam.pageIndex = page
  111. queryParam.pageSize = pageSize
  112. fetchList()
  113. }
  114. const onPageSizeChange = (current, size) => {
  115. queryParam.pageIndex = 1
  116. queryParam.pageSize = size
  117. fetchList()
  118. }
  119. const editTask = (record) => {
  120. drawerVisible.value = true
  121. drawerTitle.value = '编辑任务'
  122. editId.value = record.id
  123. }
  124. const deleteTask = (record) => {
  125. Modal.confirm({
  126. title: '确认删除该任务吗?',
  127. onOk: async () => {
  128. try {
  129. await taskApi.deleteTask(record.id)
  130. message.success('删除成功')
  131. fetchList()
  132. } catch (e) {
  133. message.error(e.msg || '删除失败')
  134. }
  135. }
  136. })
  137. }
  138. const levelFormatter = ({ text }) => {
  139. return enumFormat.value(levelEnum.value, text)
  140. }
  141. const createTask = () => {
  142. drawerVisible.value = true
  143. drawerTitle.value = '创建任务'
  144. editId.value = null
  145. }
  146. const onEditSuccess = () => {
  147. editId.value = null
  148. drawerVisible.value = false
  149. fetchList()
  150. }
  151. const closeDrawer = () => {
  152. drawerVisible.value = false
  153. }
  154. const formatDateTime = (val) => {
  155. if (!val) return ''
  156. return parseTime(val, '{y}-{m}-{d} {h}:{i}:{s}')
  157. }
  158. </script>
  159. <style lang="less" scoped>
  160. .task-container {
  161. background: #fff;
  162. padding: 24px;
  163. border-radius: 8px;
  164. }
  165. </style>