ExamStudentManage.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <template>
  2. <div class="student-manage">
  3. <div class="part-box part-box-filter">
  4. <el-form ref="FilterForm" label-position="left" label-width="90px" inline>
  5. <secp-select
  6. v-model="filterSe"
  7. defaultSelectExam
  8. @exam-default="search"
  9. ></secp-select>
  10. <el-form-item label="课程(代码):">
  11. <course-common-select
  12. v-model="filter.courseCode"
  13. placeholder="课程(代码)"
  14. clearable
  15. ></course-common-select>
  16. </el-form-item>
  17. <el-form-item label="任课老师:">
  18. <el-input
  19. v-model.trim="filter.teacher"
  20. placeholder="任课老师"
  21. clearable
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item label="学院:">
  25. <el-input
  26. v-model.trim="filter.college"
  27. placeholder="学院"
  28. clearable
  29. ></el-input>
  30. </el-form-item>
  31. <el-form-item label="专业:">
  32. <el-input
  33. v-model.trim="filter.major"
  34. placeholder="专业"
  35. clearable
  36. ></el-input>
  37. </el-form-item>
  38. <el-form-item label="班级:">
  39. <el-input
  40. v-model.trim="filter.teachClazz"
  41. placeholder="班级"
  42. clearable
  43. ></el-input>
  44. </el-form-item>
  45. <el-form-item label="姓名/学号:">
  46. <el-input
  47. v-model.trim="filter.examStudentInfo"
  48. placeholder="姓名/学号"
  49. clearable
  50. ></el-input>
  51. </el-form-item>
  52. <el-form-item>
  53. <el-button
  54. v-if="checkPrivilege('button', 'select')"
  55. type="primary"
  56. @click="toPage(1)"
  57. >查询</el-button
  58. >
  59. </el-form-item>
  60. </el-form>
  61. <div class="box-justify">
  62. <div>
  63. <el-button
  64. v-if="checkPrivilege('button', 'DeleteBatch')"
  65. type="danger"
  66. icon="el-icon-delete"
  67. @click="toBatchDelete"
  68. >批量删除</el-button
  69. >
  70. <el-button
  71. v-if="checkPrivilege('button', 'export')"
  72. type="primary"
  73. icon="el-icon-download"
  74. :loading="loading"
  75. @click="toExportStudent"
  76. >导出</el-button
  77. >
  78. </div>
  79. <div>
  80. <el-button
  81. v-if="checkPrivilege('button', 'import')"
  82. type="success"
  83. icon="el-icon-upload2"
  84. @click="toImport"
  85. >导入</el-button
  86. >
  87. <el-button
  88. v-if="checkPrivilege('button', 'import')"
  89. type="primary"
  90. icon="el-icon-s-order"
  91. @click="toDataTask"
  92. >导入结果查询</el-button
  93. >
  94. <el-button
  95. v-if="checkPrivilege('button', 'add')"
  96. type="primary"
  97. icon="el-icon-circle-plus-outline"
  98. @click="toAdd"
  99. >新增</el-button
  100. >
  101. </div>
  102. </div>
  103. </div>
  104. <div class="part-box part-box-pad">
  105. <el-table
  106. ref="TableList"
  107. :data="dataList"
  108. @selection-change="handleSelectionChange"
  109. >
  110. <el-table-column
  111. type="selection"
  112. width="55"
  113. align="center"
  114. ></el-table-column>
  115. <el-table-column
  116. prop="courseName"
  117. label="课程名称"
  118. min-width="120"
  119. ></el-table-column>
  120. <el-table-column
  121. prop="courseCode"
  122. label="课程代码"
  123. width="120"
  124. ></el-table-column>
  125. <el-table-column prop="studentName" label="姓名"></el-table-column>
  126. <el-table-column prop="studentCode" label="学号"></el-table-column>
  127. <el-table-column prop="college" label="学院"></el-table-column>
  128. <el-table-column prop="major" label="专业"></el-table-column>
  129. <el-table-column prop="teachClazz" label="教学班"></el-table-column>
  130. <el-table-column
  131. prop="paperNumber"
  132. label="试卷编号"
  133. width="120"
  134. ></el-table-column>
  135. <el-table-column prop="teacherName" label="任课老师"></el-table-column>
  136. <el-table-column
  137. prop="teacherCode"
  138. label="任课老师工号"
  139. width="120"
  140. ></el-table-column>
  141. <el-table-column
  142. prop="examDate"
  143. label="考试日期"
  144. width="100"
  145. ></el-table-column>
  146. <el-table-column
  147. prop="examTime"
  148. label="考试时间"
  149. width="160"
  150. ></el-table-column>
  151. <el-table-column
  152. prop="examPlace"
  153. label="考点(校区)"
  154. width="120"
  155. ></el-table-column>
  156. <el-table-column
  157. prop="examRoom"
  158. label="考场(考试教室)"
  159. width="140"
  160. ></el-table-column>
  161. <el-table-column
  162. class-name="action-column"
  163. label="操作"
  164. width="100"
  165. fixed="right"
  166. >
  167. <template slot-scope="scope">
  168. <el-button
  169. v-if="checkPrivilege('link', 'edit')"
  170. class="btn-primary"
  171. type="text"
  172. @click="toEdit(scope.row)"
  173. >编辑</el-button
  174. >
  175. <el-button
  176. v-if="checkPrivilege('link', 'delete')"
  177. class="btn-danger"
  178. type="text"
  179. @click="toDelete(scope.row)"
  180. >删除</el-button
  181. >
  182. </template>
  183. </el-table-column>
  184. </el-table>
  185. <div class="part-page">
  186. <el-pagination
  187. background
  188. layout="total, sizes, prev, pager, next, jumper"
  189. :pager-count="5"
  190. :current-page="current"
  191. :total="total"
  192. :page-size="size"
  193. @current-change="toPage"
  194. @size-change="pageSizeChange"
  195. >
  196. </el-pagination>
  197. </div>
  198. </div>
  199. <modify-exam-student
  200. :instance="curRow"
  201. @modified="getList"
  202. ref="ModifyExamStudent"
  203. ></modify-exam-student>
  204. <!-- ImportFile -->
  205. <import-file
  206. v-if="checkPrivilege('button', 'import')"
  207. ref="ImportFile"
  208. title="导入考生"
  209. :upload-url="uploadUrl"
  210. :upload-data="{
  211. examId: filterSe.examId,
  212. semesterId: filterSe.semesterId,
  213. }"
  214. :format="['xls', 'xlsx']"
  215. :download-handle="() => downloadTemplate('examStudent')"
  216. :download-filename="dfilename"
  217. :auto-upload="false"
  218. @upload-success="uploadSuccess"
  219. ></import-file>
  220. <!-- data-task-dialog -->
  221. <data-task-dialog
  222. v-if="checkPrivilege('button', 'import')"
  223. ref="DataTaskDialog"
  224. task-type="STUDENT_IMPORT"
  225. ></data-task-dialog>
  226. </div>
  227. </template>
  228. <script>
  229. import {
  230. examStudentListPage,
  231. deleteExamStudent,
  232. exportExamStudent,
  233. } from "../api";
  234. import ModifyExamStudent from "../components/ModifyExamStudent.vue";
  235. import ImportFile from "../../../components/ImportFile.vue";
  236. import { downloadByApi } from "@/plugins/download";
  237. import templateDownload from "@/mixins/templateDownload";
  238. export default {
  239. name: "exam-student-manage",
  240. components: { ModifyExamStudent, ImportFile },
  241. mixins: [templateDownload],
  242. data() {
  243. return {
  244. filterSe: {
  245. semesterId: "",
  246. examId: "",
  247. },
  248. filter: {
  249. courseCode: "",
  250. teacher: "",
  251. college: "",
  252. major: "",
  253. teachClazz: "",
  254. examStudentInfo: "",
  255. },
  256. current: 1,
  257. size: this.GLOBAL.pageSize,
  258. total: 0,
  259. dataList: [],
  260. multipleSelection: [],
  261. curRow: {},
  262. loading: false,
  263. // import
  264. uploadUrl: "/api/admin/basic/exam_student/import",
  265. dfilename: "考生导入模板.xlsx",
  266. };
  267. },
  268. methods: {
  269. async getList() {
  270. if (!this.checkPrivilege("list", "list")) return;
  271. const datas = {
  272. ...this.filterSe,
  273. ...this.filter,
  274. pageNumber: this.current,
  275. pageSize: this.size,
  276. };
  277. const data = await examStudentListPage(datas);
  278. this.dataList = data.records;
  279. this.total = data.total;
  280. },
  281. toPage(page) {
  282. this.current = page;
  283. this.getList();
  284. },
  285. search() {
  286. this.toPage(1);
  287. },
  288. handleSelectionChange(val) {
  289. this.multipleSelection = val.map((item) => item.id);
  290. },
  291. toAdd() {
  292. this.curRow = {};
  293. this.$refs.ModifyExamStudent.open();
  294. },
  295. toEdit(row) {
  296. this.curRow = row;
  297. this.$refs.ModifyExamStudent.open();
  298. },
  299. async toBatchDelete() {
  300. if (!this.multipleSelection.length) {
  301. this.$message.error("请选择要删除的考生");
  302. return;
  303. }
  304. const confirm = await this.$confirm(
  305. `确定要删除当前选择的所有考生吗?`,
  306. "提示",
  307. {
  308. type: "warning",
  309. }
  310. ).catch(() => {});
  311. if (confirm !== "confirm") return;
  312. await deleteExamStudent(this.multipleSelection);
  313. this.$message.success("删除成功!");
  314. this.deletePageLastItem();
  315. },
  316. toDelete(row) {
  317. this.$confirm(`确定要删除考生【${row.studentName}】吗?`, "提示", {
  318. type: "warning",
  319. })
  320. .then(async () => {
  321. await deleteExamStudent([row.id]);
  322. this.$message.success("删除成功!");
  323. this.deletePageLastItem();
  324. })
  325. .catch(() => {});
  326. },
  327. async toExportStudent() {
  328. if (this.loading) return;
  329. this.loading = true;
  330. const res = await downloadByApi(() => {
  331. return exportExamStudent(this.filter);
  332. }, "").catch((e) => {
  333. this.$message.error(e || "下载失败,请重新尝试!");
  334. });
  335. this.loading = false;
  336. if (!res) return;
  337. this.$message.success("下载成功!");
  338. },
  339. // import
  340. toImport() {
  341. this.$refs.ImportFile.open();
  342. },
  343. toDataTask() {
  344. this.$refs.DataTaskDialog.open();
  345. },
  346. validError(errorData) {
  347. this.$message.error(errorData.message);
  348. },
  349. uploadSuccess() {
  350. this.$message.success("文件上传成功,后台正在导入!");
  351. this.getList();
  352. },
  353. },
  354. };
  355. </script>