diff --git a/backend/src/api/question.js b/backend/src/api/question.js index 9ebcb4b..0755cd5 100644 --- a/backend/src/api/question.js +++ b/backend/src/api/question.js @@ -77,4 +77,22 @@ export function getList(query) { method: 'post', data: fd }) + } + export function importQuestion(obj){ + let fd = new FormData() + if(obj instanceof Object){ + Object.keys(obj).forEach(key =>{ + const o = obj[key] + if(o instanceof Object){ + fd.append(key,o) + }else{ + fd.append(key,o) + } + }) + } + return request({ + url: "/api/question/importQuestion", + method: 'post', + data: fd + }) } \ No newline at end of file diff --git a/backend/src/views/competition/components/survey.vue b/backend/src/views/competition/components/survey.vue index fd6576d..55061e6 100644 --- a/backend/src/views/competition/components/survey.vue +++ b/backend/src/views/competition/components/survey.vue @@ -195,6 +195,7 @@ export default { if(this.survey.organizer){ this.organizerList = this.survey.organizer.split('|') } + console.log(this.survey) if(this.survey.supporter2){ this.supporterList2 = this.survey.supporter2.split('|') } @@ -209,6 +210,9 @@ export default { if(nv.supporter){ this.supporterList = this.survey.supporter.split('|') } + if(nv.supporter2){ + this.supporterList2 = this.survey.supporter2.split('|') + } if(nv.organizer){ this.organizerList = this.survey.organizer.split('|') } diff --git a/backend/src/views/competition/components/task.vue b/backend/src/views/competition/components/task.vue index f719b37..cc8a753 100644 --- a/backend/src/views/competition/components/task.vue +++ b/backend/src/views/competition/components/task.vue @@ -178,7 +178,7 @@ </el-table> <el-pagination :current-page.sync="questionTempQuery.pageNo" - :page-sizes="[10,20,30,40,50]" + :page-sizes="[10,20,30,40,50,100,200]" :page-size.sync="questionTempQuery.pageSize" layout="total,prev,pager,next,jumper,sizes" :total="questionTempQuery.total" diff --git a/backend/src/views/resource/exam/add/batch.vue b/backend/src/views/resource/exam/add/batch.vue index 172671e..658dfe7 100644 --- a/backend/src/views/resource/exam/add/batch.vue +++ b/backend/src/views/resource/exam/add/batch.vue @@ -148,8 +148,10 @@ export default { const files = e.target.files const rawFile = files[0] // only use files[0] - questionApi.importExcel({ - file: rawFile + questionApi.importQuestion({ + file: rawFile, + courseId: 6, + levelId: 0 }).then(res=>{ if(res.code == 200){ this.list = res.data.list diff --git a/front/src/views/system/exam.vue b/front/src/views/system/exam.vue index 88e8789..5125eca 100644 --- a/front/src/views/system/exam.vue +++ b/front/src/views/system/exam.vue @@ -111,37 +111,38 @@ </div> </div> </div> - - <div> - <a name="anli" /> - 案例题(共<span>{{anliInfo.size}}</span>题,每题<span>{{anliInfo.score}}</span>分,共<span>{{anliInfo.sumScore}}</span>分) - </div> - <div v-for="cq in anliQuestion" :key="cq.id"> - <a :name="cq.id" /> - <div class="anli_title">案例名称:</div> - <div class="anli_sub_title" v-if="!!cq.item"> - {{cq.item.stem}} + <div v-if="anliInfo.size>0"> + <div> + <a name="anli" /> + 案例题(共<span>{{anliInfo.size}}</span>题,每题<span>{{anliInfo.score}}</span>分,共<span>{{anliInfo.sumScore}}</span>分) </div> - <div class="anli_title">案例介绍:</div> - <div class="anli_sub_title" v-html="cq.item.content"></div> - <hr class="tz-line-dash" /> - <div v-for="subcq in cq.item.children" :key="subcq.id"> - <div class="question-stem"> - {{subcq.id}}.{{subcq.stem}} + <div v-for="cq in anliQuestion" :key="cq.id"> + <a :name="cq.id" /> + <div class="anli_title">案例名称:</div> + <div class="anli_sub_title" v-if="!!cq.item"> + {{cq.item.stem}} </div> - <div v-if="subcq.questionType == 1 || subcq.questionType ==3 "> - <div v-for="subitem in subcq.answerList" :key="subitem.id" class="question"> - <b-radio v-model="subcq.answerId" :name="cq.id+'_'+subcq.id+''" :value="subitem.id" ></b-radio> <span> {{ idToName(subitem.id)}}.</span>{{subitem.title}} + <div class="anli_title">案例介绍:</div> + <div class="anli_sub_title" v-html="cq.item.content"></div> + <hr class="tz-line-dash" /> + <div v-for="subcq in cq.item.children" :key="subcq.id"> + <div class="question-stem"> + {{subcq.id}}.{{subcq.stem}} + </div> + <div v-if="subcq.questionType == 1 || subcq.questionType ==3 "> + <div v-for="subitem in subcq.answerList" :key="subitem.id" class="question"> + <b-radio v-model="subcq.answerId" :name="cq.id+'_'+subcq.id+''" :value="subitem.id" ></b-radio> <span> {{ idToName(subitem.id)}}.</span>{{subitem.title}} + </div> </div> - </div> - <div v-if="subcq.questionType == 2"> - <div v-for="subitem in subcq.answerList" :key="subitem.id" class="question"> - <b-check v-model="subcq.answerId" :name="cq.id+'_'+subcq.id+''" :value="subitem.id" ></b-check> <span> {{ idToName(subitem.id)}}.</span>{{subitem.title}} + <div v-if="subcq.questionType == 2"> + <div v-for="subitem in subcq.answerList" :key="subitem.id" class="question"> + <b-check v-model="subcq.answerId" :name="cq.id+'_'+subcq.id+''" :value="subitem.id" ></b-check> <span> {{ idToName(subitem.id)}}.</span>{{subitem.title}} + </div> </div> </div> - </div> + </div> </div> </div> diff --git a/tz/competition/target/classes/META-INF/build-info.properties b/tz/competition/target/classes/META-INF/build-info.properties index bae0263..29e1e54 100644 --- a/tz/competition/target/classes/META-INF/build-info.properties +++ b/tz/competition/target/classes/META-INF/build-info.properties @@ -1,5 +1,5 @@ build.artifact=competition build.group=com.tz build.name=competition -build.time=2022-05-16T13\:19\:35.289Z +build.time=2022-07-25T01\:13\:41.151Z build.version=1.0-SNAPSHOT diff --git a/tz/exam/exam-service/pom.xml b/tz/exam/exam-service/pom.xml index 8e8a8ec..1378ad9 100644 --- a/tz/exam/exam-service/pom.xml +++ b/tz/exam/exam-service/pom.xml @@ -32,6 +32,16 @@ <groupId>com.tz</groupId> <artifactId>system-feign</artifactId> </dependency> + <dependency> + <groupId>com.monitorjbl</groupId> + <artifactId>xlsx-streamer</artifactId> + <version>2.1.0</version> + </dependency> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + <version>3.0.5</version> + </dependency> <!--rabbitmq--> <dependency> <groupId>org.springframework.boot</groupId> @@ -43,6 +53,7 @@ <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> + </dependencies> <build> diff --git a/tz/exam/exam-service/src/main/java/com/tz/platform/pc/PCQuestionImportController.java b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/PCQuestionImportController.java index 066df6c..f5798b6 100644 --- a/tz/exam/exam-service/src/main/java/com/tz/platform/pc/PCQuestionImportController.java +++ b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/PCQuestionImportController.java @@ -21,4 +21,9 @@ public class PCQuestionImportController extends BaseController { public Result<ListQuestionImportDTO> importExcell(MultipartFile file){ return importBiz.importExcel(file,getUserNo()); } + + @PostMapping(value = "importQuestion") + public Result<ListQuestionImportDTO> importQuestion(MultipartFile file,Long courseId,Integer levelId){ + return importBiz.importExecl2(file,getUserNo(),courseId,levelId); + } } diff --git a/tz/exam/exam-service/src/main/java/com/tz/platform/pc/biz/QuestionImportBiz.java b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/biz/QuestionImportBiz.java index 222e8f4..43ef26b 100644 --- a/tz/exam/exam-service/src/main/java/com/tz/platform/pc/biz/QuestionImportBiz.java +++ b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/biz/QuestionImportBiz.java @@ -1,5 +1,8 @@ package com.tz.platform.pc.biz; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; import com.tz.platform.common.core.base.Result; import com.tz.platform.common.core.bo.Answer; import com.tz.platform.common.core.enmus.QuestionTypeEnum; @@ -13,6 +16,7 @@ import com.tz.platform.feign.user.vo.UserVo; import com.tz.platform.feign.vo.StudentLevelVo; import com.tz.platform.pc.dto.ListQuestionImportDTO; import com.tz.platform.pc.dto.QuestionImportDTO; +import com.tz.platform.pc.excel.QuestionEx; import com.tz.platform.repository.CourseDao; import com.tz.platform.repository.QuestionDao; import org.apache.catalina.User; @@ -23,6 +27,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -169,4 +174,165 @@ public class QuestionImportBiz { return Result.success(dto); } + + public Result<ListQuestionImportDTO> importExecl2(MultipartFile file,Long userNo,Long courseId,Integer leveId){ + if(userNo == null ||userNo<=0){ + return Result.error("无权操作"); + } + UserVo user = feignUser.getByUserNo(userNo); + if(user==null||user.getUserType()< UserTypeEnum.TEACHER.getCode()){ + return Result.error("无权操作"); + } + Course course = courseDao.getById(courseId); + List<StudentLevelVo> levelList = feignStudentLevel.list(); + StudentLevelVo levelVo = levelList.stream().filter(studentLevelVo -> studentLevelVo.getId().equals(leveId)).findFirst().orElse(null); + if(course == null ){ + return Result.error("请选择课程"); + } + try { + final List list = new ArrayList(); + EasyExcel.read(file.getInputStream(), QuestionEx.class, new AnalysisEventListener() { + @Override + public void invoke(Object object, AnalysisContext analysisContext) { + list.add(object); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + }).doReadAll(); + + ListQuestionImportDTO dto = new ListQuestionImportDTO(); + List<QuestionImportDTO> list2 = new ArrayList<>(); + for (Object o :list){ + QuestionEx questionEx = (QuestionEx) o; + QuestionImportDTO subDto = new QuestionImportDTO(); + subDto.setStem(questionEx.getSub()); + subDto.setQuestionType(questionEx.getType()); + subDto.setCourseName(course.getName()); + if(StringUtils.isEmpty(questionEx.getSub())){ + subDto.setStatus("题干为空"); + }else{ + List<Question> temp = questionDao.findAllByStem(questionEx.getSub()); + if (temp.size()>0) { + subDto.setStatus("题干已存在"); + } + + Question question = new Question(); + + + if (levelVo == null) { + question.setLevelId(0); + question.setLevelName("通用"); + } else { + question.setLevelId(levelVo.getId()); + question.setLevelName(levelVo.getName()); + } + + question.setStem(questionEx.getSub()); + question.setUserNo(userNo); + question.setCreateTime(new Date()); + question.setStatus(0); + question.setScore(questionEx.getScore()); + question.setCreatorId(userNo); + question.setCreator(user.getName()); + question.setType(0); + question.setAnalysis(questionEx.getAnalysis()); + question.setCourseId(course.getId()); + QuestionTypeEnum qt = null; + if(questionEx.getType().contains(QuestionTypeEnum.SINGLE.getDesc())){ + qt = QuestionTypeEnum.SINGLE; + }else if(questionEx.getType().contains(QuestionTypeEnum.MULTY.getDesc())){ + qt = QuestionTypeEnum.MULTY; + }else if(questionEx.getType().contains(QuestionTypeEnum.JUDGE.getDesc())) { + qt= QuestionTypeEnum.JUDGE; + } + if(qt == null){ + subDto.setStatus("题型未匹配"); + }else{ + List<Answer> answerList = new ArrayList<>(); + List<Integer> answerIds = new ArrayList<>(); + if(StringUtils.hasText(questionEx.getOptionA())){ + Answer answer = new Answer(); + answer.setId(1); + answer.setTitle(questionEx.getOptionA()); + answerList.add(answer); + } + + if(StringUtils.hasText(questionEx.getOptionB())){ + Answer answer = new Answer(); + answer.setId(2); + answer.setTitle(questionEx.getOptionB()); + answerList.add(answer); + } + if(StringUtils.hasText(questionEx.getOptionC())){ + Answer answer = new Answer(); + answer.setId(3); + answer.setTitle(questionEx.getOptionC()); + answerList.add(answer); + } + + if(StringUtils.hasText(questionEx.getOptionD())){ + Answer answer = new Answer(); + answer.setId(4); + answer.setTitle(questionEx.getOptionD()); + answerList.add(answer); + } + if(StringUtils.hasText(questionEx.getOptionE())){ + Answer answer = new Answer(); + answer.setId(5); + answer.setTitle(questionEx.getOptionE()); + answerList.add(answer); + } + + + String[] answerS = questionEx.getAnswer().split(","); + for(int i =0;i<answerS.length;i++){ + String a = answerS[i]; + switch (a){ + case "A": + answerIds.add(1); + break; + case "B": + answerIds.add(2); + break; + case "C": + answerIds.add(3); + break; + case "D": + answerIds.add(4); + break; + case "E": + answerIds.add(5); + break; + } + } + if(answerIds.size() == 0){ + subDto.setStatus("无答案"); + } + if(answerList.size()==0){ + subDto.setStatus("无选项"); + } + + if(answerIds.size()>0&&answerList.size()>0&&qt!=null){ + question.setQuestionType(qt.getCode()); + question.setAnswerList(answerList); + question.setAnswerId(answerIds); + question = questionDao.save(question); + subDto.setId(question.getId()); + subDto.setStatus("成功"); + } + } + list2.add(subDto); + } + + } + dto.setList(list2); + return Result.success(dto); + } catch (IOException e) { + e.printStackTrace(); + } + return Result.error("操作失败"); + } } diff --git a/tz/exam/exam-service/src/main/java/com/tz/platform/pc/excel/QuestionEx.java b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/excel/QuestionEx.java new file mode 100644 index 0000000..af88129 --- /dev/null +++ b/tz/exam/exam-service/src/main/java/com/tz/platform/pc/excel/QuestionEx.java @@ -0,0 +1,17 @@ +package com.tz.platform.pc.excel; + +import lombok.Data; + +@Data +public class QuestionEx { + private String type; + private String sub; + private String optionA; + private String optionB; + private String optionC; + private String optionD; + private String optionE; + private String answer; + private Long score; + private String analysis; +} diff --git a/tz/exam/exam-service/src/main/java/com/tz/platform/repository/QuestionDao.java b/tz/exam/exam-service/src/main/java/com/tz/platform/repository/QuestionDao.java index c7de81f..d5815a3 100644 --- a/tz/exam/exam-service/src/main/java/com/tz/platform/repository/QuestionDao.java +++ b/tz/exam/exam-service/src/main/java/com/tz/platform/repository/QuestionDao.java @@ -37,6 +37,8 @@ public interface QuestionDao extends JpaRepository<Question,Long> { Question getByStem(String stem); + List<Question> findAllByStem(String stem); + @Transactional @Modifying @Query(value = "update question set status=:status where id in (:ids)",nativeQuery = true) diff --git a/tz/exam/exam-service/src/test/java/com/tz/platform/excel/QuestionImportTest.java b/tz/exam/exam-service/src/test/java/com/tz/platform/excel/QuestionImportTest.java new file mode 100644 index 0000000..aed4fdd --- /dev/null +++ b/tz/exam/exam-service/src/test/java/com/tz/platform/excel/QuestionImportTest.java @@ -0,0 +1,35 @@ +package com.tz.platform.excel; + + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.tz.platform.pc.excel.QuestionEx; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class QuestionImportTest { + @Test + public void importTest(){ + final List list = new ArrayList(); + EasyExcel.read("/Users/tianchengjun/Desktop/资料/冠军邀请赛数据/test.xlsx", QuestionEx.class, new AnalysisEventListener() { + @Override + public void invoke(Object object, AnalysisContext analysisContext) { + list.add(object); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + + } + }).doReadAll(); + + for (Object o :list){ + QuestionEx questionEx = (QuestionEx) o; + System.out.println(questionEx.getSub()); + } + } +} diff --git a/tz/gateway/target/classes/META-INF/build-info.properties b/tz/gateway/target/classes/META-INF/build-info.properties index 08f12d6..7ecb9aa 100644 --- a/tz/gateway/target/classes/META-INF/build-info.properties +++ b/tz/gateway/target/classes/META-INF/build-info.properties @@ -1,5 +1,5 @@ build.artifact=gateway build.group=com.tz build.name=gateway -build.time=2022-05-16T13\:19\:35.289Z +build.time=2022-07-25T01\:13\:41.151Z build.version=1.0-SNAPSHOT diff --git a/tz/gateway/target/maven-archiver/pom.properties b/tz/gateway/target/maven-archiver/pom.properties index 8b023f4..0db009e 100644 --- a/tz/gateway/target/maven-archiver/pom.properties +++ b/tz/gateway/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Mon May 16 21:19:46 CST 2022 +#Mon Jul 25 09:13:46 CST 2022 version=1.0-SNAPSHOT groupId=com.tz artifactId=gateway diff --git a/tz/gateway/target/tianze-gateway.jar.original b/tz/gateway/target/tianze-gateway.jar.original index fccecc5..adb0007 100644 Binary files a/tz/gateway/target/tianze-gateway.jar.original and b/tz/gateway/target/tianze-gateway.jar.original differ