StudentManage.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  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. <el-form-item label="学院:">
  6. <college-select
  7. v-model="filter.collegeId"
  8. placeholder="学院"
  9. ></college-select>
  10. </el-form-item>
  11. <el-form-item label="专业:">
  12. <major-select
  13. v-model="filter.majorId"
  14. :college-id="filter.collegeId"
  15. cascader
  16. placeholder="专业"
  17. ></major-select>
  18. </el-form-item>
  19. <el-form-item label="班级:">
  20. <class-select
  21. v-model="filter.clazzId"
  22. :major-id="filter.majorId"
  23. cascader
  24. placeholder="班级"
  25. ></class-select>
  26. </el-form-item>
  27. <el-form-item label="姓名/学号:">
  28. <el-input
  29. style="width: 142px;"
  30. v-model.trim="filter.queryParams"
  31. placeholder="姓名/学号"
  32. clearable
  33. ></el-input>
  34. </el-form-item>
  35. <el-form-item>
  36. <el-button
  37. v-if="checkPrivilege('button', 'select')"
  38. type="primary"
  39. @click="toPage(1)"
  40. >查询</el-button
  41. >
  42. </el-form-item>
  43. </el-form>
  44. <div class="box-justify">
  45. <div>
  46. <el-button
  47. v-if="checkPrivilege('button', 'delete')"
  48. type="danger"
  49. icon="el-icon-delete"
  50. :disabled="!filterHasQuery"
  51. @click="toBatchDelete"
  52. >批量删除</el-button
  53. >
  54. <el-button
  55. v-if="checkPrivilege('button', 'export')"
  56. type="primary"
  57. icon="el-icon-download"
  58. :loading="loading"
  59. @click="toExportStudent"
  60. >导出学生</el-button
  61. >
  62. </div>
  63. <div>
  64. <el-button
  65. v-if="checkPrivilege('button', 'import')"
  66. type="success"
  67. icon="el-icon-upload2"
  68. @click="toImport"
  69. >导入学生</el-button
  70. >
  71. <el-button
  72. v-if="checkPrivilege('button', 'import')"
  73. type="primary"
  74. icon="el-icon-s-order"
  75. @click="toDataTask"
  76. >导入结果查询</el-button
  77. >
  78. <el-button
  79. v-if="checkPrivilege('button', 'add')"
  80. type="primary"
  81. icon="el-icon-circle-plus-outline"
  82. @click="toAdd"
  83. >新增学生</el-button
  84. >
  85. </div>
  86. </div>
  87. </div>
  88. <div class="part-box part-box-pad">
  89. <el-table ref="TableList" :data="dataList">
  90. <el-table-column
  91. type="index"
  92. label="序号"
  93. width="70"
  94. :index="indexMethod"
  95. ></el-table-column>
  96. <el-table-column prop="studentName" label="姓名"></el-table-column>
  97. <el-table-column prop="studentCode" label="学号"></el-table-column>
  98. <el-table-column prop="phoneNumber" label="手机号" width="120">
  99. <span slot-scope="scope">{{
  100. scope.row.phoneNumber | defaultFieldFilter
  101. }}</span>
  102. </el-table-column>
  103. <el-table-column prop="collegeName" label="学院"></el-table-column>
  104. <el-table-column prop="majorName" label="专业"></el-table-column>
  105. <el-table-column prop="clazz" label="班级"></el-table-column>
  106. <el-table-column prop="createTime" label="创建时间" width="170">
  107. <span slot-scope="scope">{{
  108. scope.row.createTime | timestampFilter
  109. }}</span>
  110. </el-table-column>
  111. <el-table-column
  112. class-name="action-column"
  113. label="操作"
  114. width="100"
  115. fixed="right"
  116. >
  117. <template slot-scope="scope">
  118. <el-button
  119. v-if="checkPrivilege('link', 'edit')"
  120. class="btn-primary"
  121. type="text"
  122. @click="toEdit(scope.row)"
  123. >编辑</el-button
  124. >
  125. <el-button
  126. v-if="checkPrivilege('link', 'delete')"
  127. class="btn-danger"
  128. type="text"
  129. @click="toDelete(scope.row)"
  130. >删除</el-button
  131. >
  132. </template>
  133. </el-table-column>
  134. </el-table>
  135. <div class="part-page">
  136. <el-pagination
  137. background
  138. layout="total, sizes, prev, pager, next, jumper"
  139. :pager-count="5"
  140. :current-page="current"
  141. :total="total"
  142. :page-size="size"
  143. @current-change="toPage"
  144. @size-change="pageSizeChange"
  145. >
  146. </el-pagination>
  147. </div>
  148. </div>
  149. <modify-student
  150. :instance="curRow"
  151. @modified="getList"
  152. ref="ModifyStudent"
  153. ></modify-student>
  154. <!-- ImportFile -->
  155. <import-file
  156. v-if="checkPrivilege('button', 'import')"
  157. ref="ImportFile"
  158. title="导入学生"
  159. :upload-url="uploadUrl"
  160. :format="['xls', 'xlsx']"
  161. :download-url="downloadUrl"
  162. :download-filename="dfilename"
  163. :auto-upload="false"
  164. @upload-success="uploadSuccess"
  165. ></import-file>
  166. <!-- data-task-dialog -->
  167. <data-task-dialog
  168. v-if="checkPrivilege('button', 'import')"
  169. ref="DataTaskDialog"
  170. task-type="STUDENT_IMPORT"
  171. ></data-task-dialog>
  172. </div>
  173. </template>
  174. <script>
  175. import {
  176. studentListQuery,
  177. deleteStudent,
  178. deleteFilterStudent,
  179. exportStudent
  180. } from "../api";
  181. import ModifyStudent from "../components/ModifyStudent";
  182. import ImportFile from "../../../components/ImportFile.vue";
  183. import { downloadByApi } from "@/plugins/download";
  184. export default {
  185. name: "student-manage",
  186. components: { ModifyStudent, ImportFile },
  187. data() {
  188. return {
  189. filter: {
  190. queryParams: "",
  191. collegeId: "",
  192. majorId: "",
  193. clazzId: ""
  194. },
  195. queriedFilter: {},
  196. current: 1,
  197. size: this.GLOBAL.pageSize,
  198. total: 0,
  199. dataList: [],
  200. curRow: {},
  201. loading: false,
  202. // import
  203. uploadUrl: "/api/admin/basic/student/data_import",
  204. downloadUrl: "/temps/studentTemplate.xlsx",
  205. dfilename: "学生导入模板.xlsx"
  206. };
  207. },
  208. computed: {
  209. filterHasQuery() {
  210. return !Object.keys(this.filter).some(
  211. k => this.filter[k] !== this.queriedFilter[k]
  212. );
  213. }
  214. },
  215. mounted() {
  216. this.getList();
  217. },
  218. methods: {
  219. async getList() {
  220. if (!this.checkPrivilege("list", "list")) return;
  221. const datas = {
  222. ...this.filter,
  223. pageNumber: this.current,
  224. pageSize: this.size
  225. };
  226. const data = await studentListQuery(datas);
  227. this.dataList = data.records;
  228. this.total = data.total;
  229. this.queriedFilter = { ...this.filter };
  230. },
  231. toPage(page) {
  232. this.current = page;
  233. this.getList();
  234. },
  235. toAdd() {
  236. this.curRow = {};
  237. this.$refs.ModifyStudent.open();
  238. },
  239. toEdit(row) {
  240. this.curRow = row;
  241. this.$refs.ModifyStudent.open();
  242. },
  243. toBatchDelete() {
  244. this.$confirm(`确定要根据设置的筛选条件删除所有数据吗?`, "提示", {
  245. type: "warning"
  246. })
  247. .then(async () => {
  248. await deleteFilterStudent(this.filter);
  249. this.$message.success("删除成功!");
  250. this.toPage(1);
  251. })
  252. .catch(() => {});
  253. },
  254. toDelete(row) {
  255. this.$confirm(`确定要删除学生【${row.studentName}】吗?`, "提示", {
  256. type: "warning"
  257. })
  258. .then(async () => {
  259. await deleteStudent([row.id]);
  260. this.$message.success("删除成功!");
  261. this.deletePageLastItem();
  262. })
  263. .catch(() => {});
  264. },
  265. async toExportStudent() {
  266. if (this.loading) return;
  267. this.loading = true;
  268. const res = await downloadByApi(() => {
  269. return exportStudent(this.filter);
  270. }, "").catch(e => {
  271. this.$message.error(e || "下载失败,请重新尝试!");
  272. });
  273. this.loading = false;
  274. if (!res) return;
  275. this.$message.success("下载成功!");
  276. },
  277. // import
  278. toImport() {
  279. this.$refs.ImportFile.open();
  280. },
  281. toDataTask() {
  282. this.$refs.DataTaskDialog.open();
  283. },
  284. validError(errorData) {
  285. this.$message.error(errorData.message);
  286. },
  287. uploadSuccess() {
  288. this.$message.success("文件上传成功,后台正在导入!");
  289. this.getList();
  290. }
  291. }
  292. };
  293. </script>