ManualBindDialog.vue 8.7 KB

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