ModifyStudent.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <template>
  2. <el-dialog
  3. class="modify-student"
  4. :visible.sync="modalIsShow"
  5. :title="title"
  6. top="10vh"
  7. width="500px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. destroy-on-close
  12. @open="visibleChange"
  13. >
  14. <el-form
  15. ref="modalFormComp"
  16. :model="modalForm"
  17. :rules="rules"
  18. :key="modalForm.id"
  19. label-width="100px"
  20. >
  21. <el-form-item prop="studentName" label="姓名:">
  22. <el-input
  23. v-model.trim="modalForm.studentName"
  24. placeholder="请输入姓名"
  25. clearable
  26. ></el-input>
  27. </el-form-item>
  28. <el-form-item prop="studentCode" label="学号:">
  29. <el-input
  30. v-model.trim="modalForm.studentCode"
  31. placeholder="请输入学号"
  32. clearable
  33. :disabled="isEdit"
  34. ></el-input>
  35. </el-form-item>
  36. <el-form-item prop="courseName" label="课程名称:">
  37. <el-input
  38. v-model.trim="modalForm.courseName"
  39. placeholder="请输入课程名称"
  40. clearable
  41. :disabled="isEdit"
  42. ></el-input>
  43. </el-form-item>
  44. <el-form-item prop="courseCode" label="课程代码:">
  45. <el-input
  46. v-model.trim="modalForm.courseCode"
  47. placeholder="请输入课程代码"
  48. clearable
  49. :disabled="isEdit"
  50. ></el-input>
  51. </el-form-item>
  52. <el-form-item prop="collegeName" label="学院:">
  53. <el-input
  54. v-model.trim="modalForm.collegeName"
  55. placeholder="请输入学院"
  56. clearable
  57. ></el-input>
  58. </el-form-item>
  59. <el-form-item prop="majorName" label="专业:">
  60. <el-input
  61. v-model.trim="modalForm.majorName"
  62. placeholder="请输入专业"
  63. clearable
  64. ></el-input>
  65. </el-form-item>
  66. <el-form-item prop="className" label="班级:">
  67. <el-input
  68. v-model.trim="modalForm.className"
  69. placeholder="请输入班级"
  70. clearable
  71. ></el-input>
  72. </el-form-item>
  73. <el-form-item prop="teacher" label="任课老师:">
  74. <el-input
  75. v-model.trim="modalForm.teacher"
  76. placeholder="请输入任课老师"
  77. clearable
  78. ></el-input>
  79. </el-form-item>
  80. <el-form-item prop="teachClass" label="教学班:">
  81. <el-input
  82. v-model.trim="modalForm.teachClass"
  83. placeholder="请输入教学班"
  84. clearable
  85. ></el-input>
  86. </el-form-item>
  87. <el-form-item prop="examRoom" label="考场:">
  88. <el-input
  89. v-model.trim="modalForm.examRoom"
  90. placeholder="请输入考场"
  91. clearable
  92. ></el-input>
  93. </el-form-item>
  94. <el-form-item prop="score" label="成绩:">
  95. <el-input-number
  96. v-model="modalForm.score"
  97. :min="0"
  98. :max="999"
  99. :step="1"
  100. step-strictly
  101. :controls="false"
  102. ></el-input-number>
  103. </el-form-item>
  104. <el-form-item prop="remark" label="备注:">
  105. <el-input
  106. v-model.trim="modalForm.remark"
  107. placeholder="请输入备注"
  108. clearable
  109. ></el-input>
  110. </el-form-item>
  111. <!-- 自定义字段 -->
  112. <template v-if="extendFields.length">
  113. <el-form-item
  114. v-for="field in extendFields"
  115. :key="field.code"
  116. :label="`${field.name}:`"
  117. >
  118. <el-input
  119. v-model.trim="modalForm[field.code]"
  120. :placeholder="`请输入${field.name}`"
  121. clearable
  122. ></el-input>
  123. </el-form-item>
  124. </template>
  125. </el-form>
  126. <div slot="footer">
  127. <el-button type="primary" :disabled="isSubmit" @click="submit"
  128. >确认</el-button
  129. >
  130. <el-button @click="cancel">取消</el-button>
  131. </div>
  132. </el-dialog>
  133. </template>
  134. <script>
  135. import { updateStudent } from "../api";
  136. const initModalForm = {
  137. id: null,
  138. semesterId: "",
  139. examId: "",
  140. courseName: "",
  141. courseCode: "",
  142. studentName: "",
  143. studentCode: "",
  144. collegeName: "",
  145. majorName: "",
  146. className: "",
  147. teacher: "",
  148. teachClass: "",
  149. examRoom: "",
  150. score: "",
  151. remark: "",
  152. };
  153. export default {
  154. name: "modify-student",
  155. props: {
  156. instance: {
  157. type: Object,
  158. default() {
  159. return {};
  160. },
  161. },
  162. extendFields: {
  163. type: Array,
  164. default() {
  165. return [];
  166. },
  167. },
  168. },
  169. computed: {
  170. isEdit() {
  171. return !!this.instance.id;
  172. },
  173. title() {
  174. return (this.isEdit ? "编辑" : "新增") + "考生";
  175. },
  176. },
  177. data() {
  178. return {
  179. modalIsShow: false,
  180. isSubmit: false,
  181. modalForm: { ...initModalForm },
  182. rules: {
  183. studentName: [
  184. {
  185. required: true,
  186. message: "请输入姓名",
  187. trigger: "change",
  188. },
  189. {
  190. message: "姓名不能超过50字符",
  191. max: 50,
  192. trigger: "change",
  193. },
  194. ],
  195. studentCode: [
  196. {
  197. required: true,
  198. message: "请输入学号",
  199. trigger: "change",
  200. },
  201. {
  202. message: "学号只能由数字、字母和下划线组成,长度1-30个字符",
  203. pattern: /^[a-zA-Z0-9_-]{1,30}$/,
  204. trigger: "change",
  205. },
  206. ],
  207. collegeName: [
  208. {
  209. message: "学院不能超过50字符",
  210. max: 50,
  211. trigger: "change",
  212. },
  213. ],
  214. majorName: [
  215. {
  216. message: "专业不能超过50字符",
  217. max: 50,
  218. trigger: "change",
  219. },
  220. ],
  221. className: [
  222. {
  223. message: "班级不能超过50字符",
  224. max: 50,
  225. trigger: "change",
  226. },
  227. ],
  228. teacher: [
  229. {
  230. message: "任课老师不能超过30字符",
  231. max: 30,
  232. trigger: "change",
  233. },
  234. ],
  235. teachClass: [
  236. {
  237. message: "教学班不能超过50字符",
  238. max: 50,
  239. trigger: "change",
  240. },
  241. ],
  242. courseName: [
  243. {
  244. required: true,
  245. message: "请输入课程名称",
  246. trigger: "change",
  247. },
  248. {
  249. message: "课程名称不能超过50字符",
  250. max: 50,
  251. trigger: "change",
  252. },
  253. ],
  254. courseCode: [
  255. {
  256. required: true,
  257. message: "请输入课程代码",
  258. trigger: "change",
  259. },
  260. {
  261. message: "课程代码不能超过50字符",
  262. max: 50,
  263. trigger: "change",
  264. },
  265. ],
  266. examRoom: [
  267. {
  268. message: "考场不能超过50字符",
  269. max: 50,
  270. trigger: "change",
  271. },
  272. ],
  273. remark: [
  274. {
  275. message: "备注不能超过50字符",
  276. max: 50,
  277. trigger: "change",
  278. },
  279. ],
  280. },
  281. };
  282. },
  283. methods: {
  284. initData(val) {
  285. const modalForm = this.$objAssign(initModalForm, val);
  286. modalForm.score = modalForm.score || undefined;
  287. if (this.extendFields.length) {
  288. const extendFieldDict = val.extendFieldDict || {};
  289. this.extendFields.forEach((field) => {
  290. modalForm[field.code] = extendFieldDict[field.code] || "";
  291. });
  292. }
  293. this.modalForm = modalForm;
  294. },
  295. visibleChange() {
  296. this.initData(this.instance);
  297. },
  298. cancel() {
  299. this.modalIsShow = false;
  300. },
  301. open() {
  302. this.modalIsShow = true;
  303. },
  304. async submit() {
  305. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  306. if (!valid) return;
  307. if (this.isSubmit) return;
  308. this.isSubmit = true;
  309. const datas = this.$objAssign(initModalForm, this.modalForm);
  310. if (this.extendFields.length) {
  311. const extendFieldsData = this.extendFields.map((field) => {
  312. return { ...field, value: this.modalForm[field.code] };
  313. });
  314. datas.extendFields = JSON.stringify(extendFieldsData);
  315. }
  316. const data = await updateStudent(datas).catch(() => {
  317. this.isSubmit = false;
  318. });
  319. if (!data) return;
  320. this.isSubmit = false;
  321. this.$message.success(this.title + "成功!");
  322. this.$emit("modified");
  323. this.cancel();
  324. },
  325. },
  326. };
  327. </script>