index.vue 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <div class="plan-index-container layout-padding">
  3. <div class="layout-padding-auto layout-padding-view pd20">
  4. <el-form :model="state.queryParams" ref="ruleFormRef" inline @submit.native.prevent :disabled="state.tableLoading">
  5. <el-form-item label="模板编号" prop="code">
  6. <el-input v-model="state.queryParams.code" placeholder="请输入" clearable @keyup.enter="handleQuery" class="keyword-input" />
  7. </el-form-item>
  8. <el-form-item label="模板标题" prop="name">
  9. <el-input v-model="state.queryParams.name" placeholder="请输入" clearable @keyup.enter="handleQuery" class="keyword-input" />
  10. </el-form-item>
  11. <el-form-item label="包含习题" prop="isContainsPractice">
  12. <el-select v-model="state.queryParams.isContainsPractice" clearable placeholder="请选择" @change="handleQuery" :disabled="state.tableLoading">
  13. <el-option key='0' label="包含" :value="0" />
  14. <el-option key='1' label="不包含" :value="1" />
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item>
  18. <el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  19. <el-button @click="drawer = true" class="default-button"> <SvgIcon name="ele-Search" class="mr5" />更多查询</el-button>
  20. </el-form-item>
  21. </el-form>
  22. <vxe-toolbar
  23. ref="toolbarRef"
  24. :loading="state.tableLoading"
  25. custom
  26. :refresh="{
  27. queryMethod: handleQuery,
  28. }"
  29. >
  30. <template #buttons>
  31. <el-button type="primary" @click="onOpenAdd" v-auth="'template:index:add'" :loading="state.tableLoading">
  32. <SvgIcon name="ele-Plus" class="mr10" />新增
  33. </el-button>
  34. </template>
  35. </vxe-toolbar>
  36. <div style="overflow: hidden; width: 100%; height: 100%; flex: 1">
  37. <vxe-table
  38. border
  39. :loading="state.tableLoading"
  40. :data="state.tableData"
  41. :column-config="{ resizable: true }"
  42. :row-config="{ isCurrent: true, isHover: true, height: 30, useKey: true }"
  43. ref="tableRef"
  44. height="auto"
  45. auto-resize
  46. show-overflow
  47. :print-config="{}"
  48. :scrollY="{ enabled: true, gt: 100 }"
  49. id="template"
  50. :custom-config="{ storage: true }"
  51. showHeaderOverflow
  52. >
  53. <vxe-column field="code" title="模板编号" width="200"></vxe-column>
  54. <vxe-column field="name" title="模板标题" min-width="200"></vxe-column>
  55. <vxe-column field="isContainsPracticeDes" title="是否包含习题" width="150"></vxe-column>
  56. <!-- <vxe-column field="status" title="状态" width="160">
  57. <template #default="{ row }">
  58. <el-switch v-model="row.status" />
  59. </template>
  60. </vxe-column> -->
  61. <vxe-column field="creatorName" title="创建人" width="150"></vxe-column>
  62. <vxe-column field="creatorOrgName" title="创建部门" width="150"></vxe-column>
  63. <vxe-column field="creationTime" title="创建时间" width="160">
  64. <template #default="{ row }">
  65. {{ formatDate(row.creationTime, 'YYYY-mm-dd HH:MM:SS') }}
  66. </template>
  67. </vxe-column>
  68. <vxe-column title="操作" fixed="right" width="120" align="center" :show-overflow="false">
  69. <template #default="{ row }">
  70. <el-button link type="primary" @click="onOpenEdit(row)" title="编辑" v-auth="'template:index:edit'">
  71. 编辑
  72. </el-button>
  73. <el-button link type="danger" @click="onRowDel(row)" title="删除" v-auth="'template:index:delete'">
  74. 删除
  75. </el-button>
  76. </template>
  77. </vxe-column>
  78. </vxe-table>
  79. </div>
  80. <pagination
  81. @pagination="queryList"
  82. :total="state.total"
  83. v-model:current-page="state.queryParams.PageIndex"
  84. v-model:page-size="state.queryParams.PageSize"
  85. :disabled="state.tableLoading"
  86. />
  87. </div>
  88. <!-- 更多查询 -->
  89. <el-drawer v-model="drawer" title="更多查询" size="500px">
  90. <el-form :model="state.queryParams" ref="drawerRuleFormRef" @submit.native.prevent label-width="100px">
  91. <el-form-item label="状态" prop="status">
  92. <el-select v-model="state.queryParams.status" clearable placeholder="请选择" @change="handleQuery" :disabled="state.tableLoading">
  93. <el-option key='0' label="停用" :value="0" />
  94. <el-option key='1' label="启用" :value="1" />
  95. </el-select>
  96. </el-form-item>
  97. <el-form-item label="创建人" prop="creatorName">
  98. <el-input v-model="state.queryParams.creatorName" placeholder="请输入" clearable class="keyword-input" />
  99. </el-form-item>
  100. <el-form-item label="创建时间>=" prop="minCreationTime">
  101. <el-date-picker v-model="state.queryParams.minCreationTime" type="datetime" class="w100" value-format="YYYY-MM-DD[T]HH:mm:ss" placeholder="请选择" popper-class="no-atTheMoment" />
  102. </el-form-item>
  103. <el-form-item label="创建时间<=" prop="maxCreationTime">
  104. <el-date-picker v-model="state.queryParams.maxCreationTime" type="datetime" class="w100" value-format="YYYY-MM-DD[T]HH:mm:ss" placeholder="请选择" popper-class="no-atTheMoment" />
  105. </el-form-item>
  106. </el-form>
  107. <template #footer>
  108. <el-button type="primary" @click="handleQuery" :loading="state.tableLoading"> <SvgIcon name="ele-Search" class="mr5" />查询 </el-button>
  109. <el-button @click="resetQuery(drawerRuleFormRef)" class="default-button"> <SvgIcon name="ele-Refresh" class="mr5" />重置 </el-button>
  110. </template>
  111. </el-drawer>
  112. <template-add ref="templateAddRef" @updateList="queryList" />
  113. <template-edit ref="templateEditRef" @updateList="queryList" />
  114. </div>
  115. </template>
  116. <script lang="tsx" setup name="template">
  117. import { ref, reactive, onMounted, defineAsyncComponent, computed } from 'vue';
  118. import { ElMessageBox, ElMessage } from 'element-plus';
  119. import { useRouter } from 'vue-router';
  120. import type { FormInstance } from 'element-plus';
  121. import { formatDate } from '@/utils/formatTime';
  122. import 'splitpanes/dist/splitpanes.css';
  123. import Other from '@/utils/other';
  124. import { downloadFileByStream } from '@/utils/tools';
  125. import {deleteTrainTemplate, getTrainTemplateData} from '@/api/examTrain/trainTemplate';
  126. // 引入组件
  127. const pagination = defineAsyncComponent(() => import('@/components/ProTable/components/Pagination.vue')); // 分页
  128. const TemplateAdd = defineAsyncComponent(() => import('@/views/examTrain/train/template/components/Template-add.vue')); // 新增组件
  129. const TemplateEdit = defineAsyncComponent(() => import('@/views/examTrain/train/template/components/Template-edit.vue')); // 修改组件
  130. const router = useRouter(); //路由
  131. // 定义变量内容
  132. const state = reactive<any>({
  133. queryParams: {
  134. PageIndex: 1, //页码
  135. PageSize: 20, //每页条数
  136. code: null, // 编号
  137. name: null, // 名称
  138. status: null, // 状态
  139. isContainsPractice: null , // 是否包含习题
  140. creatorName: null , // 创建人
  141. minCreationTime: null , // 创建时间>=
  142. maxCreationTime: null , // 创建时间<=
  143. },
  144. tableData: [], //表格数据
  145. total: 0, //总条数
  146. tableLoading: false, //表格loading
  147. });
  148. /** 搜索按钮操作 节流操作 */
  149. const handleQuery = () => {
  150. state.queryParams.PageIndex = 1;
  151. queryList();
  152. };
  153. /** 获取试题列表 */
  154. const requestParams = ref<EmptyObjectType>({});
  155. const queryList = () => {
  156. state.tableLoading = true;
  157. requestParams.value = Other.deepClone(state.queryParams);
  158. getTrainTemplateData(requestParams.value)
  159. .then((response: any) => {
  160. console.log(response)
  161. state.tableData = response?.result.items ?? [];
  162. state.total = response?.result.pagination.totalCount ?? 0;
  163. state.tableLoading = false;
  164. })
  165. .catch(() => {
  166. state.tableLoading = false;
  167. });
  168. };
  169. /** 重置按钮操作 */
  170. const drawerRuleFormRef = ref();
  171. const ruleFormRef = ref<RefType>(); // 表单ref
  172. const drawer = ref(false);
  173. const resetQuery = (formEl: FormInstance | undefined) => {
  174. if (!formEl) return;
  175. formEl.resetFields();
  176. ruleFormRef.value?.resetFields();
  177. handleQuery();
  178. };
  179. // 打开新增弹窗
  180. const templateAddRef = ref<RefType>(); // 新增ref
  181. const onOpenAdd = () => {
  182. templateAddRef.value.openDialog();
  183. };
  184. // 打开编辑弹窗
  185. const templateEditRef = ref<RefType>(); // 修改ref
  186. const onOpenEdit = (row: any) => {
  187. templateEditRef.value.openDialog(row, state.tableData);
  188. };
  189. // 删除当前行
  190. const onRowDel = (row: any) => {
  191. ElMessageBox.confirm(`是否确认删除当前培训模板?删除后不可恢复`, '提示', {
  192. confirmButtonText: '确定',
  193. cancelButtonText: '取消',
  194. type: 'warning',
  195. })
  196. .then(() => {
  197. deleteTrainTemplate({id: row.id}).then(() => {
  198. ElMessage.success('删除成功');
  199. queryList();
  200. });
  201. })
  202. .catch(() => {});
  203. };
  204. const tableRef = ref<RefType>();
  205. const toolbarRef = ref<RefType>();
  206. onMounted(() => {
  207. queryList();
  208. if (tableRef.value && toolbarRef.value) {
  209. tableRef.value.connect(toolbarRef.value);
  210. }
  211. });
  212. </script>