Selaa lähdekoodia

一键导入特殊处理的几个题型

dusenyao 1 vuosi sitten
vanhempi
commit
0883b09310

+ 6 - 20
src/views/exercise_questions/create/components/exercises/ChineseQuestion.vue

@@ -34,19 +34,19 @@
             <template v-else>
               <div :class="['upload-audio-play']">
                 <UploadAudio
+                  v-if="data.other.audio_generation_method === 'upload'"
                   :key="item.audio_file_id || i"
                   :file-id="item.audio_file_id"
                   :item-index="i"
                   :show-upload="!item.audio_file_id"
                   @upload="uploads"
                   @deleteFile="deleteFiles"
-                  v-if="data.other.audio_generation_method === 'upload'"
                 />
                 <div
                   v-else-if="data.other.audio_generation_method === 'auto'"
+                  v-loading="loading_list[i] ? loading_list[i].loading : false"
                   class="auto-matically"
                   @click="handleMatically(item, i)"
-                  v-loading="loading_list[i] ? loading_list[i].loading : false"
                 >
                   <SvgIcon icon-class="voiceprint-line" class="record" />
                   <span class="auto-btn">{{ item.audio_file_id ? '已生成' : '生成音频' }}</span>
@@ -159,6 +159,7 @@ import {
   learnTypeList,
   audioGenerationMethodList,
   getOption,
+  analysisRecognitionChineseData,
 } from '@/views/exercise_questions/data/chinese';
 
 export default {
@@ -208,7 +209,6 @@ export default {
       immediate: true,
     },
   },
-  mounted() {},
   methods: {
     addOption() {
       this.data.option_list.push(getOption());
@@ -370,24 +370,10 @@ export default {
      * 智能识别
      * @param {String} text 识别数据
      */
-    recognition(text) {
+    async recognition(text) {
       let arr = this.recognitionCommon(text);
-      this.data.option_list = [];
-      arr.map((content, index) => {
-        let content_item = content.split('/');
-        this.data.option_list.push({
-          content: content_item[0] ? content_item[0] : '',
-          mark: getRandomNumber(),
-          audio_file_id: '',
-          pinyin: content_item[1] ? content_item[1] : '',
-          pinyin_item_list: [],
-          definition: content_item[2] ? content_item[2] : '',
-          collocation: content_item[3] ? content_item[3] : '',
-          hz_strokes_list: [],
-        });
-        this.handleSplitPy(this.data.option_list[index]);
-        this.handleChineseStrokes(this.data.option_list[index], index);
-      });
+      let obj = await analysisRecognitionChineseData(arr);
+      this.recognitionCommonSetObj(obj);
     },
   },
 };

+ 4 - 2
src/views/exercise_questions/create/components/exercises/ChooseToneQuestion.vue

@@ -163,6 +163,7 @@ import {
   audioGenerationMethodList,
   toneList,
   toneTypeList,
+  analysisRecognitionChooseToneData,
 } from '@/views/exercise_questions/data/chooseTone';
 import { GetStaticResources } from '@/api/app';
 
@@ -365,11 +366,12 @@ export default {
     },
     /**
      * 智能识别
-     * @param {String} text 识别数据
+     * @param {string} text 识别数据
      */
     recognition(text) {
       let arr = this.recognitionCommon(text);
-      this.data.option_list = arr.map((content) => getOption(content));
+      let obj = analysisRecognitionChooseToneData(arr);
+      this.recognitionCommonSetObj(obj);
       this.data.option_list.forEach((item) => {
         this.handleItemAnswer(item);
       });

+ 4 - 24
src/views/exercise_questions/create/components/exercises/WordCardQuestion.vue

@@ -166,9 +166,9 @@ import SoundRecord from '../common/SoundRecord.vue';
 import { GetStaticResources, GetFileStoreInfo } from '@/api/app';
 import { changeOptionType, handleInputNumber, addTone } from '@/views/exercise_questions/data/common';
 import UploadDrag from '../common/UploadDrag.vue';
-import { getRandomNumber } from '@/utils/index';
 
 import {
+  analysisRecognitionWordCardData,
   wordCardData,
   learnTypeList,
   audioGenerationMethodList,
@@ -429,30 +429,10 @@ export default {
      * 智能识别
      * @param {String} text 识别数据
      */
-    recognition(text) {
+    async recognition(text) {
       let arr = this.recognitionCommon(text);
-      this.data.option_list = [];
-      arr.map((content, index) => {
-        let content_item = content.split('/');
-        this.data.option_list.push({
-          content: content_item[0] ? content_item[0] : '',
-          mark: getRandomNumber(),
-          audio_file_id: '',
-          pinyin: content_item[1] ? content_item[1] : '',
-          definition: content_item[2] ? content_item[2] : '',
-          collocation: content_item[3] ? content_item[3] : '',
-          example_sentence: content_item.length > 3 ? content_item.slice(4) : [''],
-          picture_file_id: '',
-          hz_strokes_list: [],
-        });
-        let obj = {
-          loading: false,
-          loadings: false,
-        };
-        this.loading_list.push(obj);
-        this.handleChineseStrokes(this.data.option_list[index], index);
-        this.changePinyin(this.data.option_list[index]);
-      });
+      let obj = await analysisRecognitionWordCardData(arr);
+      this.recognitionCommonSetObj(obj);
     },
   },
 };

+ 8 - 13
src/views/exercise_questions/create/components/exercises/WordDictationQuestion.vue

@@ -148,7 +148,12 @@ import { GetStaticResources } from '@/api/app';
 import { changeOptionType, handleInputNumber, addTone } from '@/views/exercise_questions/data/common';
 import { getRandomNumber } from '@/utils/index';
 
-import { wordDictationData, audioGenerationMethodList, getOption } from '@/views/exercise_questions/data/wordDictation';
+import {
+  wordDictationData,
+  audioGenerationMethodList,
+  getOption,
+  analysisRecognitionWordDictationData,
+} from '@/views/exercise_questions/data/wordDictation';
 
 export default {
   name: 'WordDictationQuestion',
@@ -324,18 +329,8 @@ export default {
      */
     recognition(text) {
       let arr = this.recognitionCommon(text);
-      this.data.option_list = [];
-      arr.map((content, index) => {
-        let content_item = content.split('/');
-        this.data.option_list.push({
-          content: content_item[0] ? content_item[0] : '',
-          mark: getRandomNumber(),
-          audio_file_id: '',
-          pinyin: content_item[1] ? content_item[1] : '',
-          pinyin_item_list: [],
-        });
-        this.handleSplitPy(this.data.option_list[index]);
-      });
+      let obj = analysisRecognitionWordDictationData(arr);
+      this.recognitionCommonSetObj(obj);
     },
   },
 };

+ 2 - 2
src/views/exercise_questions/create/index.vue

@@ -176,8 +176,8 @@ export default {
     oneClickImport() {
       this.importVisible = true;
     },
-    oneKeyImport(text) {
-      let dataList = analysisOneKeyImportData(text.split(/\n\s*\n+/));
+    async oneKeyImport(text) {
+      let dataList = await analysisOneKeyImportData(text.split(/\n\s*\n+/));
       this.importVisible = false;
       const loading = this.$loading({
         text: '正在导入题目,请稍等...',

+ 126 - 0
src/views/exercise_questions/data/chinese.js

@@ -1,5 +1,7 @@
 import { stemTypeList, scoreTypeList, questionNumberTypeList, switchOption, fontSizeList } from './common';
 import { getRandomNumber } from '@/utils/index';
+import { GetStaticResources } from '@/api/app';
+import { addTone } from '@/views/exercise_questions/data/common';
 
 export function getOption(content = '') {
   return {
@@ -35,6 +37,130 @@ export const audioGenerationMethodList = [
   },
 ];
 
+export function handleValue(valItem) {
+  let numList = [];
+  if (/[A-Za-zü]+\d/g.test(valItem)) {
+    valItem.split('').forEach((item, i) => {
+      if (/\d/.test(item)) {
+        let con = valItem.replace(/\d/g, '');
+        numList.push({
+          index: i,
+          number: item,
+          con,
+          isTran: true,
+        });
+      }
+    });
+  } else {
+    numList = [];
+  }
+
+  return numList.length === 0 ? [{ con: valItem }] : numList;
+}
+
+function handleReplaceTone(value, mark, matically_pinyin_obj) {
+  if (!value) return;
+  let res_arr = [];
+  value.split(/\s+/).forEach((item) => {
+    res_arr.push(handleValue(item));
+  });
+  matically_pinyin_obj[mark] = res_arr
+    .map((item) => item.map(({ number, con }) => (number && con ? addTone(Number(number), con) : number || con || '')))
+    .filter((item) => item.length > 0)
+    .join(' ');
+}
+
+export function handleItemPinyin(content, mark, matically_pinyin_obj) {
+  let content_arr = content.trim().split(' ');
+  matically_pinyin_obj[mark] = [];
+  content_arr.forEach((items) => {
+    let items_trim = items.trim();
+    if (items_trim) {
+      handleReplaceTone(items_trim, mark, matically_pinyin_obj);
+    }
+  });
+}
+
+// 切割拼音
+export function handleSplitPy(item) {
+  let index = item.pinyin.search(/0|1|2|3|4/);
+  let matically_pinyin_obj = {};
+  if (index > -1) {
+    handleItemPinyin(item.pinyin, item.mark, matically_pinyin_obj);
+    setTimeout(() => {
+      item.pinyin = matically_pinyin_obj[item.mark];
+    }, 100);
+  }
+  let pinyin_list = item.pinyin.trim().split(' ');
+  item.pinyin_item_list = [];
+  pinyin_list.forEach((itemp) => {
+    item.pinyin_item_list.push({
+      pinyin_item: itemp,
+    });
+  });
+}
+
+async function fetchStrokesContent(itemc, indexc, content_arr_strokes) {
+  let MethodName = 'hz_resource_manager-GetHZStrokesContent';
+  let data = {
+    hz: itemc,
+  };
+  const res = await GetStaticResources(MethodName, data);
+  content_arr_strokes[indexc] = {
+    hz: itemc.trim(),
+    strokes: res,
+  };
+}
+
+// 生成汉字
+export async function handleChineseStrokes(item) {
+  if (item.content.trim()) {
+    let content_arr = item.content.trim().split('');
+    let content_arrs = [];
+    let content_arr_strokes = [];
+    content_arr.forEach((itemc) => {
+      if (itemc.trim()) {
+        content_arrs.push(itemc.trim());
+      }
+    });
+
+    await Promise.all(
+      content_arrs.map(async (itemc, indexc) => await fetchStrokesContent(itemc, indexc, content_arr_strokes)),
+    );
+    item.hz_strokes_list = content_arr_strokes;
+  }
+}
+
+/**
+ * 解析智能识别数据
+ * @param {array} arr 智能识别数据
+ * @returns object
+ */
+export async function analysisRecognitionChineseData(arr) {
+  const option_list = await Promise.all(
+    arr.map(async (content) => {
+      const content_item = content.split('/');
+      const option = {
+        content: content_item[0] || '',
+        mark: getRandomNumber(),
+        audio_file_id: '',
+        pinyin: content_item[1] || '',
+        pinyin_item_list: [],
+        definition: content_item[2] || '',
+        collocation: content_item[3] || '',
+        hz_strokes_list: [],
+      };
+      handleSplitPy(option);
+      await handleChineseStrokes(option);
+      return option;
+    }),
+  );
+
+  return {
+    'data.option_list': option_list,
+  };
+}
+
 // 书写题数据模板
 export const chineseData = {
   type: 'chinese', // 题型

+ 11 - 0
src/views/exercise_questions/data/chooseTone.js

@@ -46,6 +46,17 @@ export const audioGenerationMethodList = [
   },
 ];
 
+/**
+ * 解析智能识别数据
+ * @param {array} arr 智能识别数据
+ * @returns object
+ */
+export function analysisRecognitionChooseToneData(arr) {
+  return {
+    'data.option_list': arr.map(getOption),
+  };
+}
+
 // 选择声调题数据模板
 export const ChooseToneData = {
   type: 'choose_tone', // 题型

+ 64 - 51
src/views/exercise_questions/data/questionType.js

@@ -3,7 +3,7 @@ import { analysisRecognitionJudgeData, getJudgeData } from './judge';
 import { analysisRecognitionFillData, fillData } from './fill';
 import { analysisRecognitionSortData, getSortDataTemplate } from './sort';
 import { analysisRecognitionMatchingData, getMatchingDataTemplate } from './matching';
-import { ChooseToneData } from './chooseTone';
+import { ChooseToneData, analysisRecognitionChooseToneData } from './chooseTone';
 import { essayQuestionData } from './essayQuestion';
 import { analysisRecognitionReadAloudData, readAloudData } from './readAloud';
 import { analysisRecognitionRepeatData, repeatData } from './repeat';
@@ -14,17 +14,15 @@ import { analysisRecognitionReplaceAnswerData, replaceAnswerData } from './repla
 import { analysisRecognitionListenSelectData, getListenSelectData } from './listenSelect';
 import { analysisRecognitionListenFillData, listenFillData } from './listenFill';
 import { analysisRecognitionListenJudgeData, getListenJudgeData } from './listenJudge';
-import { chineseData } from './chinese';
-import { wordCardData } from './wordCard';
+import { analysisRecognitionChineseData, chineseData } from './chinese';
+import { analysisRecognitionWordCardData, wordCardData } from './wordCard';
 import { analysisRecognitionWriteData, writeData } from './write';
 import { writePictrueData } from './writePicture';
 import { analysisRecognitionReadData, readData } from './read';
 import { analysisRecognitionTableFillData, getTableFillData } from './tableFill';
-import { wordDictationData } from './wordDictation';
+import { analysisRecognitionWordDictationData, wordDictationData } from './wordDictation';
 import { activityData } from './activity';
 
-import { AddQuestionToExercise } from '@/api/exercise';
-
 // 题型源数据
 export const questionTypeDataOption = [
   {
@@ -195,7 +193,7 @@ const analysisFunctions = {
   fill: analysisRecognitionFillData,
   sort: analysisRecognitionSortData,
   matching: analysisRecognitionMatchingData,
-  // choose_tone: analysisRecognitionSelectData,
+  choose_tone: analysisRecognitionChooseToneData,
   table_fill: analysisRecognitionTableFillData,
   read_aloud: analysisRecognitionReadAloudData,
   repeat: analysisRecognitionRepeatData,
@@ -206,15 +204,25 @@ const analysisFunctions = {
   listen_judge: analysisRecognitionListenJudgeData,
   write: analysisRecognitionReadData,
   read: analysisRecognitionWriteData,
+  word_dictation: analysisRecognitionWordDictationData,
+  // 特殊处理的函数
+  chinese: analysisRecognitionChineseData,
+  word_card: analysisRecognitionWordCardData,
 };
+
 /**
  * 获取智能识别各个题型独有的数据解析返回值
  * @param {array} dataArr 智能识别数据
  * @param {string} type 题型类型
  * @returns object
  */
-function getRecognitionData(dataArr, type) {
-  const analysisFunction = analysisFunctions[type];
+async function getRecognitionData(dataArr, type) {
+  let analysisFunction = null;
+  if (['chinese', 'word_card'].type) {
+    return await analysisFunctions[type](dataArr);
+  }
+  analysisFunction = analysisFunctions[type];
+
   if (!analysisFunction) return {};
 
   return analysisFunction(dataArr);
@@ -224,53 +232,58 @@ function getRecognitionData(dataArr, type) {
  * 解析一键导入数据
  * @param {Array} questionList 题目列表
  */
-export function analysisOneKeyImportData(questionList) {
+export async function analysisOneKeyImportData(questionList) {
   let dataList = [];
-  questionList.forEach((item) => {
-    let arr = item
-      .split(/[\r\n]/)
-      .map((item) => item.trim())
-      .filter((item) => item);
-    if (arr.length === 0) return;
-    let [question_number, type_name] = arr[0].split('.');
-    // 题型类型
-    let type = Object.entries(exerciseNames).find(([key, value]) => {
-      return value === type_name.trim();
-    })?.[0];
-    arr = arr.slice(1);
+  await Promise.all(
+    questionList.map(async (item, i) => {
+      let arr = item
+        .split(/[\r\n]/)
+        .map((item) => item.trim())
+        .filter((item) => item);
+      if (arr.length === 0) return;
+      let [question_number, type_name] = arr[0].split('.');
 
-    if (!type || arr.length === 0) return;
+      if (!type_name) return;
 
-    // 是否启用参考答案
-    let isEnableReferenceAnswer = false; // 是否启用参考答案
-    if (['table_fill', 'answer_question'].includes(type)) {
-      isEnableReferenceAnswer = true;
-    }
-    let data = JSON.parse(JSON.stringify(questionDataList[type]));
-    data.property.question_number = question_number; // 题号
+      // 题型类型
+      let type = Object.entries(exerciseNames).find(([key, value]) => {
+        return value === type_name.trim();
+      })?.[0];
+      arr = arr.slice(1);
+
+      if (!type || arr.length === 0) return;
+
+      // 是否启用参考答案
+      let isEnableReferenceAnswer = false; // 是否启用参考答案
+      if (['table_fill', 'answer_question'].includes(type)) {
+        isEnableReferenceAnswer = true;
+      }
+      let data = JSON.parse(JSON.stringify(questionDataList[type]));
+      data.property.question_number = question_number; // 题号
 
-    let dataArr = analysisRecognition(arr, data, isEnableReferenceAnswer); // 解析公有的数据,并返回剩余的数据
+      let dataArr = analysisRecognition(arr, data, isEnableReferenceAnswer); // 解析公有的数据,并返回剩余的数据
 
-    let recObj = getRecognitionData(dataArr, type); // 获取各个题型独有的数据解析返回值
-    // 将独有的数据解析返回值合并到 data 中
-    Object.keys(recObj).forEach((key) => {
-      key
-        .split('.')
-        .slice(1)
-        .reduce((prev, cur, index, arr) => {
-          if (index === arr.length - 1) {
-            prev[cur] = recObj[key];
-          } else {
-            return prev[cur];
-          }
-        }, data);
-    });
-    dataList.push({
-      type: data.type,
-      additional_type: data.type === 'select' ? 'single' : '',
-      content: data,
-    });
-  });
+      let recObj = await getRecognitionData(dataArr, type); // 获取各个题型独有的数据解析返回值
+      // 将独有的数据解析返回值合并到 data 中
+      Object.keys(recObj).forEach((key) => {
+        key
+          .split('.')
+          .slice(1)
+          .reduce((prev, cur, index, arr) => {
+            if (index === arr.length - 1) {
+              prev[cur] = recObj[key];
+            } else {
+              return prev[cur];
+            }
+          }, data);
+      });
+      dataList[i] = {
+        type: data.type,
+        additional_type: data.type === 'select' ? 'single' : '',
+        content: data,
+      };
+    }),
+  );
 
   return dataList;
 }

+ 0 - 1
src/views/exercise_questions/data/tableFill.js

@@ -39,7 +39,6 @@ export function analysisRecognitionTableFillData(arr) {
   }
 
   // 通过正则表达式匹配出表格内容
-  console.log(arr);
   let matches = arr.map((str) => {
     return str.match(/[((](.*?)[))]/g).map((item) => item.replace(/[((](.*?)[))]/g, '$1'));
   });

+ 45 - 0
src/views/exercise_questions/data/wordCard.js

@@ -7,6 +7,7 @@ import {
   fontSizeList,
 } from './common';
 import { getRandomNumber } from '@/utils/index';
+import { handleChineseStrokes, handleItemPinyin } from './chinese';
 
 export function getOption(content = '') {
   return {
@@ -38,6 +39,50 @@ export const audioGenerationMethodList = [
   },
 ];
 
+// 修改拼音
+function changePinyin(item) {
+  let index = item.pinyin.search(/0|1|2|3|4/);
+  if (index > -1) {
+    let matically_pinyin_obj = {};
+    handleItemPinyin(item.pinyin, item.mark, matically_pinyin_obj);
+    setTimeout(() => {
+      item.pinyin = matically_pinyin_obj[item.mark];
+    }, 100);
+  }
+}
+
+/**
+ * 解析智能识别数据
+ * @param {array} arr 智能识别数据
+ * @returns object
+ */
+export async function analysisRecognitionWordCardData(arr) {
+  let option_list = await Promise.all(
+    arr.map(async (content) => {
+      let content_item = content.split('/');
+      let option = {
+        content: content_item[0] ? content_item[0] : '',
+        mark: getRandomNumber(),
+        audio_file_id: '',
+        pinyin: content_item[1] ? content_item[1] : '',
+        definition: content_item[2] ? content_item[2] : '',
+        collocation: content_item[3] ? content_item[3] : '',
+        example_sentence: content_item.length > 3 ? content_item.slice(4) : [''],
+        picture_file_id: '',
+        hz_strokes_list: [],
+      };
+
+      await handleChineseStrokes(option);
+      changePinyin(option);
+      return option;
+    }),
+  );
+
+  return {
+    'data.option_list': option_list,
+  };
+}
+
 // 字词卡片数据模板
 export const wordCardData = {
   type: 'word_card', // 题型

+ 25 - 0
src/views/exercise_questions/data/wordDictation.js

@@ -7,6 +7,7 @@ import {
   fontSizeList,
 } from './common';
 import { getRandomNumber } from '@/utils/index';
+import { handleSplitPy } from './chinese';
 
 export function getOption(content = '') {
   return {
@@ -33,6 +34,30 @@ export const audioGenerationMethodList = [
   },
 ];
 
+/**
+ * 解析智能识别数据
+ * @param {array} arr 智能识别数据
+ * @returns object
+ */
+export function analysisRecognitionWordDictationData(arr) {
+  let option_list = [];
+  arr.map((content, index) => {
+    let content_item = content.split('/');
+    option_list.push({
+      content: content_item[0] ? content_item[0] : '',
+      mark: getRandomNumber(),
+      audio_file_id: '',
+      pinyin: content_item[1] ? content_item[1] : '',
+      pinyin_item_list: [],
+    });
+    handleSplitPy(option_list[index]);
+  });
+
+  return {
+    'data.option_list': option_list,
+  };
+}
+
 // 听写题数据模板
 export const wordDictationData = {
   type: 'word_dictation', // 题型

+ 2 - 6
src/views/exercise_questions/preview/WritePictruePreview.vue

@@ -26,8 +26,8 @@
 
     <div v-if="answer.answer_list[active_index]" class="content-right">
       <el-input
-        class="write-input"
         v-model="answer.answer_list[active_index].text"
+        class="write-input"
         rows="12"
         resize="none"
         type="textarea"
@@ -35,8 +35,8 @@
         :maxlength="data.property.word_num"
         show-word-limit
         :readonly="disabled"
-        @input="handleInput"
         :autosize="{ minRows: 5 }"
+        @input="handleInput"
       />
     </div>
     <template v-if="isEnable(data.property.is_enable_upload_accessory)">
@@ -95,10 +95,6 @@ export default {
       immediate: true,
     },
   },
-  created() {
-    console.log(this.data);
-    // this.handleData();
-  },
   methods: {
     // 初始化数据
     handleData() {

+ 0 - 1
src/views/home/recovery/index.vue

@@ -85,7 +85,6 @@ export default {
         .then(() => {
           StopShareRecord({ share_record_id })
             .then(() => {
-              console.log(1);
               this.$message.success('停止成功');
               this.getPageList();
             })