OfflineExamModal.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <template>
  2. <Modal
  3. ref="uploadModal"
  4. v-model="uploadModalVisible"
  5. mask
  6. footer-hide
  7. :mask-closable="false"
  8. :closable="true"
  9. width="660"
  10. title="上传文件"
  11. @close="modalClose"
  12. >
  13. <div style="font-size: 16px; line-height: 20px">
  14. <span style="padding-right: 10px">课程名称:</span>
  15. <span style="font-size: 22px; color: red">{{ course.courseName }}</span>
  16. </div>
  17. <div style="font-size: 16px; line-height: 20px; margin: 20px 0">
  18. <span style="padding-right: 10px">请选择上传文件类型:</span>
  19. <span
  20. v-if="serverFormat.includes('ZIP')"
  21. @click="selectedFileType = 'ZIP'"
  22. >
  23. <input
  24. type="radio"
  25. name="filetype"
  26. value="ZIP"
  27. :checked="selectedFileType == 'ZIP'"
  28. style="display: inline-block"
  29. />
  30. <span class="right-margin">ZIP</span>
  31. </span>
  32. <span
  33. v-if="serverFormat.includes('PDF')"
  34. @click="selectedFileType = 'PDF'"
  35. >
  36. <input
  37. type="radio"
  38. name="filetype"
  39. value="PDF"
  40. :checked="selectedFileType == 'PDF'"
  41. style="display: inline-block"
  42. />
  43. <span class="right-margin">PDF</span>
  44. </span>
  45. <span
  46. v-if="serverFormat.includes('IMAGE')"
  47. @click="selectedFileType = 'IMAGE'"
  48. >
  49. <input
  50. type="radio"
  51. name="filetype"
  52. value="IMAGE"
  53. :checked="selectedFileType == 'IMAGE'"
  54. style="display: inline-block"
  55. />
  56. <span class="right-margin">图片</span>
  57. </span>
  58. </div>
  59. <div
  60. style="font-size: 16px; line-height: 20px; margin: 20px 0; display: flex"
  61. >
  62. <div style="padding-right: 10px">请选择文件:</div>
  63. <OfflineExamUpload
  64. :course="course"
  65. :selected-file-type="selectedFileType"
  66. :upload-file-format="uploadFileFormat"
  67. :upload-file-accept="uploadFileAccept"
  68. @reload-list="$emit('reload-list')"
  69. @close-modal="closeModal"
  70. />
  71. </div>
  72. </Modal>
  73. </template>
  74. <script>
  75. import OfflineExamUpload from "./OfflineExamUpload.vue";
  76. export default {
  77. name: "OfflineExamModal",
  78. components: {
  79. OfflineExamUpload: OfflineExamUpload,
  80. },
  81. props: {
  82. course: {
  83. type: Object,
  84. default() {
  85. return {};
  86. },
  87. },
  88. },
  89. data() {
  90. return {
  91. uploadModalVisible: true,
  92. serverFormat: "",
  93. selectedFileType: "",
  94. // uploadFileFormat: [],
  95. // uploadFileAccept: "",
  96. };
  97. },
  98. computed: {
  99. uploadFileFormat() {
  100. let res;
  101. switch (this.selectedFileType) {
  102. case "":
  103. res = [];
  104. break;
  105. case "ZIP":
  106. res = ["zip"];
  107. break;
  108. case "PDF":
  109. res = ["pdf"];
  110. break;
  111. case "IMAGE":
  112. res = ["jpeg", "jpg", "png"];
  113. break;
  114. }
  115. return res;
  116. },
  117. uploadFileAccept() {
  118. let res;
  119. switch (this.selectedFileType) {
  120. case "":
  121. res = "";
  122. break;
  123. case "ZIP":
  124. res = ".zip,zip";
  125. break;
  126. case "PDF":
  127. res = ".pdf";
  128. break;
  129. case "IMAGE":
  130. res = ".jpeg,.jpg,.png";
  131. break;
  132. }
  133. return res;
  134. },
  135. },
  136. watch: {
  137. course() {
  138. this.updateServerFormat();
  139. this.selectedFileType = "";
  140. },
  141. },
  142. async created() {
  143. this.updateServerFormat();
  144. // this.uploadFileFormat =
  145. // (res.data.OFFLINE_UPLOAD_FILE_TYPE &&
  146. // JSON.parse(res.data.OFFLINE_UPLOAD_FILE_TYPE)) ||
  147. // [];
  148. // this.uploadFileFormat = this.uploadFileFormat.map((v) => v.toLowerCase());
  149. // this.uploadFileAccept = this.uploadFileFormat
  150. // .map((v) => "application/" + v)
  151. // .join();
  152. // if (this.uploadFileAccept.includes("zip")) {
  153. // this.uploadFileAccept = ".zip," + this.uploadFileAccept;
  154. // }
  155. },
  156. methods: {
  157. async updateServerFormat() {
  158. const res = await this.$http.get(
  159. "/api/ecs_exam_work/exam/getExamPropertyFromCacheByStudentSession/" +
  160. this.course.examId +
  161. `/OFFLINE_UPLOAD_FILE_TYPE`
  162. );
  163. this.serverFormat =
  164. (res.data.OFFLINE_UPLOAD_FILE_TYPE &&
  165. JSON.parse(res.data.OFFLINE_UPLOAD_FILE_TYPE)) ||
  166. [];
  167. },
  168. modalClose() {
  169. this.selectedFileType = "";
  170. },
  171. closeModal() {
  172. this.selectedFileType = "";
  173. this.$refs.uploadModal.visible = false;
  174. },
  175. },
  176. };
  177. </script>
  178. <style scoped>
  179. .right-margin {
  180. padding: 0 15px 0 5px;
  181. }
  182. </style>