You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							366 lines
						
					
					
						
							9.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							366 lines
						
					
					
						
							9.4 KiB
						
					
					
				| <template> | |
|   <div class="container"> | |
|     <div class="main"> | |
|       <div class="content"> | |
|         <div class="title"> | |
|           {{ questionList[0].name }} | |
|         </div> | |
|         <template v-for="(question, questionIndex) in questionList" :key="questionIndex"> | |
|           <!-- 单选 --> | |
|           <template v-if="question.type == 1"> | |
|             <div class="question"> | |
|               {{ questionIndex + 1 }}. {{ question.description }}(单选) | |
|             </div> | |
|             <div v-for="(answer, index) in question.content" :key="index" class="answer"> | |
|               <div class="selected"> | |
|                 <input :id="`select-${questionIndex}-${index}`" :name="`radio-group-${questionIndex}`" type="radio" | |
|                        v-model="selectedAnswers[questionIndex]" | |
|                        :value="answer.text" | |
|                 > | |
|                 <label :for="`select-${questionIndex}-${index}`">{{ answer.text }}</label> | |
|               </div> | |
|             </div> | |
|           </template> | |
|  | |
|           <!-- 多选 --> | |
|           <template v-if="question.type == 2"> | |
|             <div class="question"> | |
|               {{ questionIndex + 1 }}. {{ question.description }}(多选) | |
|             </div> | |
|             <div v-for="(answer, index) in question.content" :key="index" class="answer"> | |
|               <div class="selected"> | |
|                 <input :id="`checkbox-${questionIndex}-${index}`" name="checkbox" type="checkbox" | |
|                        v-model="selectedAnswers[questionIndex]" | |
|                        :value="answer.text" | |
|                 > | |
|                 <label :for="`checkbox-${questionIndex}-${index}`">{{ answer.text }}</label> | |
|               </div> | |
|             </div> | |
|           </template> | |
|  | |
|           <!-- 简答题 --> | |
|           <template v-if="question.type == 3"> | |
|             <div class="Short-answers"> | |
|               <div class="question"> | |
|                 {{ questionIndex + 1 }}. {{ question.description }} | |
|               </div> | |
|               <el-input | |
|                   v-model="editorTitles[questionIndex]" | |
|                   style="width: 100%; padding: 3.5%" | |
|                   size="large" | |
|                   placeholder="请输入标题(5-100字符)" | |
|                   maxlength="100" | |
|                   minlength="5" | |
|                   show-word-limit | |
|               /> | |
|               <div class="editor"> | |
|                 <div style="border: 1px solid #ccc"> | |
|                   <Toolbar | |
|                       style="border-bottom: 1px solid #ccc" | |
|                       :editor="editorRefs[questionIndex]" | |
|                       :defaultConfig="toolbarConfig" | |
|                       :mode="mode" | |
|                   /> | |
|                   <Editor | |
|                       style="height: 500px; overflow-y: hidden;" | |
|                       v-model="editorContents[questionIndex]" | |
|                       :defaultConfig="editorConfig" | |
|                       :mode="mode" | |
|                       @onCreated="editor => handleCreated(editor, questionIndex)" | |
|  | |
|                   /> | |
|                 </div> | |
|               </div> | |
|             </div> | |
|           </template> | |
|         </template> | |
|  | |
|         <!-- 提交按钮 --> | |
|         <div class="submit"> | |
|           <img src="https://d31zlh4on95l9h.cloudfront.net/images/5iujb101000d2foxm6thylaa50qz6lgl.png" @click="submit"> | |
|         </div> | |
|         <!-- 提交次数 --> | |
|         <div class="submit-times"> | |
|           <span>您已提交{{sub}}次,每个作业可以提交3次</span> | |
|         </div> | |
|       </div> | |
|     </div> | |
|   </div> | |
| 
 | |
| 
 | |
| </template> | |
| 
 | |
| <script setup> | |
| import { onMounted, ref, shallowRef } from 'vue'; | |
| import homeworkApi from "@/api/HomeworkApi.js"; | |
| import { ElMessage } from "element-plus"; | |
| import '@wangeditor/editor/dist/css/style.css' // 引入 css | |
| import { onBeforeUnmount } from 'vue' | |
| import { Editor, Toolbar } from '@wangeditor/editor-for-vue' | |
| import {useRoute, useRouter} from "vue-router"; | |
| 
 | |
| const router = useRouter(); | |
| const route = useRoute(); | |
| let groupId = route.params.id; | |
| let sub = route.params.sub; | |
| // 编辑器实例,必须用 shallowRef | |
| const editorRefs = ref([]); | |
| 
 | |
| // 内容 HTML | |
| const editorContents = ref([]); | |
| const editorTitles = ref([]); | |
| 
 | |
| // 模拟 ajax 异步获取内容 | |
| onMounted(() => { | |
|   setTimeout(() => { | |
|     editorContents.value = editorContents.value.map(() => ''); | |
|   }, 1500) | |
| }) | |
| 
 | |
| const toolbarConfig = { | |
|   excludeKeys: [ | |
|     'justify', | |
|     'table', | |
|     'codeBlock', | |
|     'divider', | |
|     'undo', | |
|     'redo', | |
|     'insertImage',  // 去掉插入图片 | |
|     'insertLink',   // 去掉插入链接 | |
|     'insertTable',  // 去掉插入表格 | |
|     'video', | |
|     'group-more-style', | |
|     'group-image', | |
|     'group-video', | |
|     'fullScreen', | |
|     'todo' | |
|   ], | |
|   insertKeys: { | |
|     index: 0, | |
|     keys: ['bold', 'italic'] | |
|   } | |
| } | |
| 
 | |
| 
 | |
| const editorConfig = { | |
|   placeholder: '请输入内容...', | |
|   toolbarKeys: toolbarConfig.toolbarKeys | |
|   } | |
| 
 | |
| // 组件销毁时,也及时销毁编辑器 | |
| onBeforeUnmount(() => { | |
|   editorRefs.value.forEach(editor => { | |
|     if (editor == null) return; | |
|     editor.destroy(); | |
|   }); | |
| }) | |
| 
 | |
| const handleCreated = (editor, questionIndex) => { | |
|   editorRefs.value[questionIndex] = editor; // 记录 editor 实例 | |
|   editor.config.toolbarConfig = toolbarConfig; // 确保配置正确应用 | |
| } | |
| 
 | |
| const questionList = ref([]); | |
| 
 | |
| function getQuestionList() { | |
|   console.log("ljghasjkhdjksahjkhsajkhjkasd",groupId); | |
|   homeworkApi.getHomeworkQuestion(groupId).then(resp => { | |
|     if (resp.code == 200) { | |
|       questionList.value = resp.data; | |
|       for (let i = 0; i < questionList.value.length; i++) { | |
|         questionList.value[i].content = JSON.parse(questionList.value[i].content); | |
|         // 初始化 editorTitles 和 editorContents | |
|         editorTitles.value.push(''); | |
|         editorContents.value.push(''); | |
|         // 初始化 selectedAnswers 为数组 | |
|         selectedAnswers.value.push([]); | |
|       } | |
|     } else { | |
|       ElMessage.error("未知错误,请联系管理员"); | |
|     } | |
|   }); | |
| } | |
| getQuestionList(); | |
| 
 | |
| // 提交作业 | |
| const homework = ref([]); | |
| 
 | |
| const selectedAnswers = ref([]); | |
| questionList.value.forEach(() => { | |
|   selectedAnswers.value.push([]); | |
| }); | |
| 
 | |
| // 上一个页面传递的参数 groupId | |
| function submit() { | |
|   homework.value = []; | |
|   for (let i = 0; i < questionList.value.length; i++) { | |
|     if (questionList.value[i].type == 1 || questionList.value[i].type == 2) { | |
|       homework.value.push({ | |
|         "id": questionList.value[i].id, | |
|         "answer": selectedAnswers.value[i], | |
|         "type": questionList.value[i].type | |
|       }); | |
|     } else if (questionList.value[i].type == 3) { | |
|       const editor = editorRefs.value[i]; | |
|       const plainText = editor ? editor.getText() : ''; | |
|       homework.value.push({ | |
|         "id": questionList.value[i].id, | |
|         "answer": [editorTitles.value[i], plainText], | |
|         "type": questionList.value[i].type | |
|       }); | |
|     } | |
|   } | |
|   let groupId = route.params.id; | |
|   let sub = route.params.sub; | |
|   if (sub <=2){ | |
|     homeworkApi.submitHomework(homework.value, groupId).then(resp => { | |
|       if (resp.code == 200) { | |
|         ElMessage.success("提交成功"); | |
|         homework.value = []; | |
|         router.push("/show"); | |
|       } else { | |
|         ElMessage.error("未知错误,请联系管理员"); | |
|       } | |
|     }); | |
|   }else { | |
|     ElMessage.error("提交失败您,已提交3次,每个作业可以提交3次"); | |
|   } | |
| } | |
| </script> | |
| 
 | |
| <style scoped> | |
| .container { | |
|   text-align: center; | |
|   margin-left: auto; | |
|   margin-right: auto; | |
|   width: 34.375rem; | |
|   height: 114.399375rem; | |
| } | |
| 
 | |
| .main { | |
|   background-image: url("https://lfjf.rzfwq.com/jtzy/Product/pcjingwang/images/20230823/qiangdianbanHomeWorkBg.png"); | |
|   background-size: contain; | |
|   background-position: center 0; | |
|   background-repeat: no-repeat; | |
|   margin: 0; | |
|   width: 100%; | |
|   height: 1830px; | |
|   text-align: center; | |
|   position: relative; | |
| } | |
| 
 | |
| .content { | |
|   position: absolute; | |
|   width: 93%; | |
|   height: 80%; | |
|   overflow-y: scroll; | |
|   /* 居中显示 */ | |
|   left: 50%; | |
|   transform: translate(-50%, 0); | |
|   top: 12.5%; | |
|   text-align: left; | |
| } | |
| 
 | |
| /* 滚动条样式 */ | |
| .content::-webkit-scrollbar { | |
|   width: 3px; | |
| } | |
| 
 | |
| .content::-webkit-scrollbar-track { | |
|   background: #f1f1f1; /* 滚动条轨道的背景色 */ | |
| } | |
| 
 | |
| .content::-webkit-scrollbar-thumb { | |
|   background: #d9d9d9; /* 滚动条滑块的颜色 */ | |
|   border-radius: 6px; /* 滑块的圆角 */ | |
| } | |
| 
 | |
| .title { | |
|   font-size: 1.65rem; | |
|   font-weight: 600; | |
|   /* 居中显示 */ | |
|   text-align: center; | |
|   /*字体颜色*/ | |
|   color: #3f27b1; | |
| } | |
| 
 | |
| .question { | |
|   padding-top: 10%; | |
|   padding-left: 4%; | |
|   font-size: 1.35rem; | |
|   font-weight: 500; | |
| } | |
| 
 | |
| .answer { | |
|   padding-top: 2.5%; | |
|   padding-left: 7%; | |
|   font-size: 1.35rem; | |
| } | |
| 
 | |
| .selected { | |
|   display: block; | |
|   padding: 1% 0 1.2% 0; | |
| } | |
| 
 | |
| 
 | |
| .selected input[name="checkbox"] { | |
|   margin-right: 1%; | |
|   width: 1.2rem; | |
|   height: 1rem; | |
|   /* 透明度 */ | |
|   opacity: 0.8; | |
|   cursor: pointer; /* 鼠标悬停时变成手的形状 */ | |
| } | |
| .selected input[type="radio"]{ | |
|   margin-right: 1%; | |
|   width: 1.2rem; | |
|   height: 1rem; | |
|   /* 透明度 */ | |
|   opacity: 0.8; | |
|   cursor: pointer; /* 鼠标悬停时变成手的形状 */ | |
| } | |
| 
 | |
| /* 单选按钮选中时的样式 */ | |
| .selected input[type="radio"]:checked { | |
|   accent-color: blue; /* 设置选中时的颜色为蓝色 */ | |
| } | |
| 
 | |
| /* 多选按钮选中时的样式 */ | |
| .selected input[type="checkbox"]:checked { | |
|   accent-color: blue; /* 设置选中时的颜色为蓝色 */ | |
| } | |
| 
 | |
| .selected label { | |
|   cursor: pointer; | |
| } | |
| 
 | |
| .editor { | |
|   padding-top: 2.5%; | |
|   padding-left: 3.5%; | |
|   padding-right: 3.5%; | |
|   height: 30rem; | |
| } | |
| 
 | |
| .Short-answers { | |
|   height: 48rem; | |
| } | |
| 
 | |
| .submit { | |
|   display: block; | |
|   text-align: center; | |
| } | |
| 
 | |
| .submit img { | |
|   padding-top: 2.5%; | |
|   padding-left: 3.5%; | |
|   padding-right: 3.5%; | |
|   cursor: pointer; | |
|   width: 67%; | |
| } | |
| 
 | |
| .submit-times { | |
|   font-size: 0.8rem; | |
|   color: #858585; | |
|   text-align: center; | |
| } | |
| </style>
 |