ModifyStudent.vue 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. import { slashesLimitValidator } from "@/plugins/formRules";
  137. const initModalForm = {
  138. id: null,
  139. semesterId: "",
  140. examId: "",
  141. courseName: "",
  142. courseCode: "",
  143. studentName: "",
  144. studentCode: "",
  145. collegeName: "",
  146. majorName: "",
  147. className: "",
  148. teacher: "",
  149. teachClass: "",
  150. examRoom: "",
  151. score: "",
  152. remark: "",
  153. };
  154. export default {
  155. name: "modify-student",
  156. props: {
  157. instance: {
  158. type: Object,
  159. default() {
  160. return {};
  161. },
  162. },
  163. extendFields: {
  164. type: Array,
  165. default() {
  166. return [];
  167. },
  168. },
  169. },
  170. computed: {
  171. isEdit() {
  172. return !!this.instance.id;
  173. },
  174. title() {
  175. return (this.isEdit ? "编辑" : "新增") + "考生";
  176. },
  177. },
  178. data() {
  179. return {
  180. modalIsShow: false,
  181. isSubmit: false,
  182. modalForm: { ...initModalForm },
  183. rules: {
  184. studentName: [
  185. {
  186. required: true,
  187. message: "请输入姓名",
  188. trigger: "change",
  189. },
  190. {
  191. message: "姓名不能超过50字符",
  192. max: 50,
  193. trigger: "change",
  194. },
  195. ],
  196. studentCode: [
  197. {
  198. required: true,
  199. message: "请输入学号",
  200. trigger: "change",
  201. },
  202. {
  203. message: "学号只能由数字、字母和下划线组成,长度1-30个字符",
  204. pattern: /^[a-zA-Z0-9_-]{1,30}$/,
  205. trigger: "change",
  206. },
  207. ],
  208. collegeName: [
  209. {
  210. message: "学院不能超过50字符",
  211. max: 50,
  212. trigger: "change",
  213. },
  214. ],
  215. majorName: [
  216. {
  217. message: "专业不能超过50字符",
  218. max: 50,
  219. trigger: "change",
  220. },
  221. ],
  222. className: [
  223. {
  224. message: "班级不能超过50字符",
  225. max: 50,
  226. trigger: "change",
  227. },
  228. ...slashesLimitValidator,
  229. ],
  230. teacher: [
  231. {
  232. message: "任课老师不能超过30字符",
  233. max: 30,
  234. trigger: "change",
  235. },
  236. ],
  237. teachClass: [
  238. {
  239. message: "教学班不能超过50字符",
  240. max: 50,
  241. trigger: "change",
  242. },
  243. ],
  244. courseName: [
  245. {
  246. required: true,
  247. message: "请输入课程名称",
  248. trigger: "change",
  249. },
  250. {
  251. message: "课程名称不能超过50字符",
  252. max: 50,
  253. trigger: "change",
  254. },
  255. ...slashesLimitValidator,
  256. ],
  257. courseCode: [
  258. {
  259. required: true,
  260. message: "请输入课程代码",
  261. trigger: "change",
  262. },
  263. {
  264. message: "课程代码不能超过50字符",
  265. max: 50,
  266. trigger: "change",
  267. },
  268. ...slashesLimitValidator,
  269. ],
  270. examRoom: [
  271. {
  272. message: "考场不能超过50字符",
  273. max: 50,
  274. trigger: "change",
  275. },
  276. ...slashesLimitValidator,
  277. ],
  278. remark: [
  279. {
  280. message: "备注不能超过50字符",
  281. max: 50,
  282. trigger: "change",
  283. },
  284. ],
  285. },
  286. };
  287. },
  288. methods: {
  289. initData(val) {
  290. const modalForm = this.$objAssign(initModalForm, val);
  291. modalForm.score = modalForm.score || undefined;
  292. if (this.extendFields.length) {
  293. const extendFieldDict = val.extendFieldDict || {};
  294. this.extendFields.forEach((field) => {
  295. modalForm[field.code] = extendFieldDict[field.code] || "";
  296. });
  297. }
  298. this.modalForm = modalForm;
  299. },
  300. visibleChange() {
  301. this.initData(this.instance);
  302. },
  303. cancel() {
  304. this.modalIsShow = false;
  305. },
  306. open() {
  307. this.modalIsShow = true;
  308. },
  309. async submit() {
  310. const valid = await this.$refs.modalFormComp.validate().catch(() => {});
  311. if (!valid) return;
  312. if (this.isSubmit) return;
  313. this.isSubmit = true;
  314. const datas = this.$objAssign(initModalForm, this.modalForm);
  315. if (this.extendFields.length) {
  316. const extendFieldsData = this.extendFields.map((field) => {
  317. return { ...field, value: this.modalForm[field.code] };
  318. });
  319. datas.extendFields = JSON.stringify(extendFieldsData);
  320. }
  321. const data = await updateStudent(datas).catch(() => {
  322. this.isSubmit = false;
  323. });
  324. if (!data) return;
  325. this.isSubmit = false;
  326. this.$message.success(this.title + "成功!");
  327. this.$emit("modified");
  328. this.cancel();
  329. },
  330. },
  331. };
  332. </script>