ActivityManagementDialog.vue 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <el-dialog
  3. ref="dialog"
  4. :title="(isEdit ? '编辑' : '新增') + '场次'"
  5. width="450px"
  6. :visible.sync="visible"
  7. @close="closeDialog"
  8. >
  9. <el-form
  10. :model="form"
  11. ref="form"
  12. :rules="rules"
  13. label-position="right"
  14. label-width="120px"
  15. >
  16. <el-row>
  17. <el-form-item label="考试时间" prop="startTime">
  18. <el-date-picker
  19. v-model="form.startTime"
  20. type="datetime"
  21. placeholder="选择日期时间"
  22. >
  23. </el-date-picker>
  24. </el-form-item>
  25. </el-row>
  26. <el-row>
  27. <el-form-item label="交卷时间" prop="finishTime">
  28. <el-date-picker
  29. v-model="form.finishTime"
  30. type="datetime"
  31. placeholder="选择日期时间"
  32. >
  33. </el-date-picker>
  34. </el-form-item>
  35. </el-row>
  36. <el-row>
  37. <el-form-item label="考试时长" prop="prepareSeconds">
  38. <MinuteInput v-model="form.maxDurationSeconds" />
  39. </el-form-item>
  40. </el-row>
  41. <el-row>
  42. <el-form-item label="候考时间" prop="prepareSeconds">
  43. <MinuteInput v-model="form.prepareSeconds" />
  44. </el-form-item>
  45. </el-row>
  46. <el-row>
  47. <el-form-item label="迟到时长" prop="prepareSeconds">
  48. <MinuteInput v-model="form.openingSeconds" />
  49. </el-form-item>
  50. </el-row>
  51. <el-row>
  52. <el-form-item label="状态" prop="enable">
  53. <el-radio-group class="pull_right_sm" v-model="form.enable">
  54. <el-radio :label="1">启用</el-radio>
  55. <el-radio :label="0">禁用</el-radio>
  56. </el-radio-group>
  57. </el-form-item>
  58. </el-row>
  59. <el-row class="d-flex justify-content-center">
  60. <el-button type="primary" @click="submitForm">保 存</el-button>
  61. <el-button @click="closeDialog">取 消</el-button>
  62. </el-row>
  63. </el-form>
  64. </el-dialog>
  65. </template>
  66. <script>
  67. import MinuteInput from "@/components/MinuteInput";
  68. import { saveActivity } from "@/api/examwork-activity";
  69. import moment from "moment";
  70. import { getExamDetail } from "@/api/examwork-exam";
  71. export default {
  72. name: "ActivityManagementDialog",
  73. components: { MinuteInput },
  74. props: {
  75. examId: String,
  76. activity: Object,
  77. },
  78. computed: {
  79. isEdit() {
  80. return this.activity.id;
  81. },
  82. },
  83. data() {
  84. return {
  85. visible: false,
  86. exam: {},
  87. form: {
  88. id: "",
  89. startTime: null,
  90. finishTime: null,
  91. prepareSeconds: 0,
  92. openingSeconds: 0,
  93. maxDurationSeconds: 0,
  94. enable: 0,
  95. },
  96. rules: {
  97. startTime: [
  98. { required: true, message: "开始时间必填" },
  99. {
  100. validator: (rule, value) => {
  101. return new Promise((resolve, reject) => {
  102. if (
  103. moment(value).isBetween(
  104. moment(this.exam.startTime),
  105. moment(this.exam.endTime),
  106. undefined,
  107. "[]"
  108. )
  109. ) {
  110. resolve(); // reject with error message
  111. } else {
  112. reject("reject");
  113. }
  114. });
  115. },
  116. message: "场次的开始时间不在考试的时间范围",
  117. },
  118. ],
  119. finishTime: [
  120. { required: true, message: "交卷时间必填" },
  121. {
  122. validator: (rule, value) => {
  123. return new Promise((resolve, reject) => {
  124. if (
  125. moment(value).isBetween(
  126. moment(this.exam.startTime),
  127. moment(this.exam.endTime),
  128. undefined,
  129. "[]"
  130. )
  131. ) {
  132. resolve(); // reject with error message
  133. } else {
  134. reject("reject");
  135. }
  136. });
  137. },
  138. message: "场次的交卷时间不在考试的时间范围",
  139. },
  140. ],
  141. maxDurationSeconds: [{ required: true, message: "考试时长必填" }],
  142. prepareSeconds: [{ required: true, message: "候考时间必填" }],
  143. openingSeconds: [{ required: true, message: "迟到时长必填" }],
  144. },
  145. };
  146. },
  147. watch: {
  148. activity(val) {
  149. let tmp = { ...val };
  150. if (!tmp.id) {
  151. tmp = {
  152. id: "",
  153. startTime: null,
  154. finishTime: null,
  155. prepareSeconds: 0,
  156. openingSeconds: 0,
  157. maxDurationSeconds: 0,
  158. enable: 0,
  159. };
  160. }
  161. this.form = tmp;
  162. },
  163. },
  164. methods: {
  165. async openDialog() {
  166. this.visible = true;
  167. try {
  168. this.exam = (await getExamDetail({ id: this.examId }))?.data.data;
  169. } catch (error) {
  170. console.log(error);
  171. this.$notify({ type: "error", title: "获取考试详情失败" });
  172. }
  173. },
  174. closeDialog() {
  175. this.visible = false;
  176. },
  177. async submitForm() {
  178. let data = this.form;
  179. data = { ...data, examId: this.examId };
  180. if (this.isEdit) {
  181. data = { ...data, id: this.activity.id };
  182. }
  183. await saveActivity(data);
  184. this.$emit("reload");
  185. this.closeDialog();
  186. },
  187. },
  188. };
  189. </script>
  190. <style></style>