Browse Source

代码优化及bug修复

lideyin 5 years ago
parent
commit
1356bc82ff

+ 64 - 31
examcloud-exchange-outer-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/outer/api/provider/ExamQuestionOuterServiceProvider.java

@@ -31,6 +31,7 @@ import org.apache.commons.collections.CollectionUtils;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
+import org.jsoup.safety.Whitelist;
 import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -258,18 +259,27 @@ public class ExamQuestionOuterServiceProvider extends ControllerSupport implemen
                                                                  AnswerType answerType,
                                                                  QuestionType questionType, Long examId) {
         String transformedAnswerType = getTransformedAnswerType(answerType, questionType, examId);
-        String transformedStudentAnswer = getTransformedStudentAnswer(studentAnswer);
 
         List<OuterSectionBean> sectionBeanList = new ArrayList<>();
         List<OuterBlockBean> blockBeanList = new ArrayList<>();
 
         //校验答案格式,校验成功才追加至集合,否则不追加
-        if (validateAnswer(transformedAnswerType, transformedStudentAnswer)) {
-            //图片文件特殊处理
-            if (!StringUtils.isNullOrEmpty(transformedStudentAnswer) && "image".equals(transformedAnswerType)) {
-                if (transformedStudentAnswer.indexOf("|") > -1) {
+        //图片文件特殊处理
+        if ("image".equals(transformedAnswerType)) {
+            if (validateImgAnswer(studentAnswer)) {
+                //图片文本部分
+                String txtStr = getImgTxt(studentAnswer);
+                if (!StringUtils.isNullOrEmpty(txtStr)) {
+                    OuterBlockBean blockBean = new OuterBlockBean();
+                    blockBean.setType("text");
+                    blockBean.setValue(txtStr);
+                    blockBeanList.add(blockBean);
+                }
 
-                    String[] imgAnswers = transformedStudentAnswer.split("\\|");
+                //图片部分
+                String imgSrc = getImgSrc(studentAnswer);
+                if (imgSrc.indexOf("|") > -1) {
+                    String[] imgAnswers = imgSrc.split("\\|");
 
                     for (int i = 0; i < imgAnswers.length; i++) {
                         OuterBlockBean blockBean = new OuterBlockBean();
@@ -289,12 +299,20 @@ public class ExamQuestionOuterServiceProvider extends ControllerSupport implemen
                     }
 
                 }
-            } else {
+            }
+        } else if ("audio".equals(transformedAnswerType)){
+            if (validateAudioAnswer(studentAnswer)) {
                 OuterBlockBean blockBean = new OuterBlockBean();
                 blockBean.setType(transformedAnswerType);
-                blockBean.setValue(getSimpleTransformedAnswer(transformedAnswerType, transformedStudentAnswer));
+                blockBean.setValue(getSimpleTransformedAnswer(transformedAnswerType, studentAnswer));
                 blockBeanList.add(blockBean);
             }
+
+        }else {
+            OuterBlockBean blockBean = new OuterBlockBean();
+            blockBean.setType(transformedAnswerType);
+            blockBean.setValue(getSimpleTransformedAnswer(transformedAnswerType, studentAnswer));
+            blockBeanList.add(blockBean);
         }
 
         OuterSectionBean sectionBean = new OuterSectionBean();
@@ -345,31 +363,43 @@ public class ExamQuestionOuterServiceProvider extends ControllerSupport implemen
     }
 
     /**
-     * 转化过的作答
+     * 获取图片作答的文本部分
+     *
+     * @param studentAnswer
+     * @return
+     */
+    private String getImgTxt(String studentAnswer) {
+        return Jsoup.clean(studentAnswer, Whitelist.basic());
+    }
+
+    /**
+     * 获取图片作答图片路径
      *
      * @param studentAnswer
      * @return
      */
-    private String getTransformedStudentAnswer(String studentAnswer) {
+    private String getImgSrc(String studentAnswer) {
         if (StringUtils.isNullOrEmpty(studentAnswer)) {
             return studentAnswer;
         }
 
-        //图片题特殊处理(因为图片作答题中有html标签)
+        //图片题特殊处理(因为图片作答题中有html标签,只需要取url即可)
         Document doc = Jsoup.parse(studentAnswer);
-        Elements imgElements = doc.select("img[src]");
-        String imgStudentAnswer = "";
+        Elements imgElements = doc.select("imgSrc[src]");
+
+        String imgSrc = "";
+
         for (Element el : imgElements) {
             String src = el.attr("src");
             if (!StringUtils.isNullOrEmpty(src)) {
-                imgStudentAnswer += src + "|";
+                imgSrc += src + "|";
             }
         }
-        if (!StringUtils.isNullOrEmpty(imgStudentAnswer)) {
-            return imgStudentAnswer.substring(0, imgStudentAnswer.length() - 1);
+        if (!StringUtils.isNullOrEmpty(imgSrc)) {
+            return imgSrc.substring(0, imgSrc.length() - 1);
         }
 
-        return studentAnswer;
+        return imgSrc;
     }
 
     /**
@@ -506,29 +536,32 @@ public class ExamQuestionOuterServiceProvider extends ControllerSupport implemen
     }
 
     /**
-     * 校验答案格式是否正确
+     * 校验图片答案格式是否正确
      *
-     * @param realAnswerType
      * @param studentAnswer
      * @return
      */
-    private boolean validateAnswer(String realAnswerType, String studentAnswer) {
+    private boolean validateImgAnswer(String studentAnswer) {
         if (StringUtils.isNullOrEmpty(studentAnswer)) {
             return false;
         }
 
-        String regExp;
-        switch (realAnswerType) {
-            case "image":
-                //图片必须包含.png|jpg|gif|jpeg
-                regExp = "^(ftp|https?)\\:\\/\\/([\\w\\_\\-]+)\\.([\\w\\-]+[\\.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)\\.(png|jpg|gif|jpeg).*$";
-                return studentAnswer.matches(regExp);
-            case "audio":
-                //音频必须包含.mp3
-                regExp = "^(ftp|https?)\\:\\/\\/([\\w\\_\\-]+)\\.([\\w\\-]+[\\.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)\\.(mp3)";
-                return studentAnswer.matches(regExp);
+        String regExp = "(\\S)*(ftp|https?)\\:\\/\\/([\\w\\_\\-]+)\\.([\\w\\-]+[\\.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)\\.(png|jpg|gif|jpeg).*$";
+        return studentAnswer.matches(regExp);
+    }
+
+    /**
+     * 校验音频答案格式是否正确
+     *
+     * @param studentAnswer
+     * @return
+     */
+    private boolean validateAudioAnswer(String studentAnswer) {
+        if (StringUtils.isNullOrEmpty(studentAnswer)) {
+            return false;
         }
 
-        return true;
+        String regExp = "^(ftp|https?)\\:\\/\\/([\\w\\_\\-]+)\\.([\\w\\-]+[\\.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)\\.(mp3)";
+        return studentAnswer.matches(regExp);
     }
 }