|
@@ -1,28 +1,30 @@
|
|
|
-import { getSelectData } from './select';
|
|
|
-import { getJudgeData } from './judge';
|
|
|
-import { fillData } from './fill';
|
|
|
-import { getSortDataTemplate } from './sort';
|
|
|
-import { getMatchingDataTemplate } from './matching';
|
|
|
+import { analysisRecognitionSelectData, getSelectData } from './select';
|
|
|
+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 { essayQuestionData } from './essayQuestion';
|
|
|
-import { readAloudData } from './readAloud';
|
|
|
-import { repeatData } from './repeat';
|
|
|
+import { analysisRecognitionReadAloudData, readAloudData } from './readAloud';
|
|
|
+import { analysisRecognitionRepeatData, repeatData } from './repeat';
|
|
|
import { talkPictrueData } from './talkPicture';
|
|
|
-import { getDialogueData } from './dialogue';
|
|
|
+import { analysisRecognitionDialogueData, getDialogueData } from './dialogue';
|
|
|
import { answerQuestionData } from './answerQuestion';
|
|
|
-import { replaceAnswerData } from './replaceAnswer';
|
|
|
-import { getListenSelectData } from './listenSelect';
|
|
|
-import { listenFillData } from './listenFill';
|
|
|
-import { getListenJudgeData } from './listenJudge';
|
|
|
+import { analysisRecognitionReplaceAnswerData, replaceAnswerData } from './replaceAnswer';
|
|
|
+import { analysisRecognitionListenSelectData, getListenSelectData } from './listenSelect';
|
|
|
+import { analysisRecognitionListenFillData, listenFillData } from './listenFill';
|
|
|
+import { analysisRecognitionListenJudgeData, getListenJudgeData } from './listenJudge';
|
|
|
import { chineseData } from './chinese';
|
|
|
import { wordCardData } from './wordCard';
|
|
|
-import { writeData } from './write';
|
|
|
+import { analysisRecognitionWriteData, writeData } from './write';
|
|
|
import { writePictrueData } from './writePicture';
|
|
|
-import { readData } from './read';
|
|
|
-import { getTableFillData } from './tableFill';
|
|
|
+import { analysisRecognitionReadData, readData } from './read';
|
|
|
+import { analysisRecognitionTableFillData, getTableFillData } from './tableFill';
|
|
|
import { wordDictationData } from './wordDictation';
|
|
|
import { activityData } from './activity';
|
|
|
|
|
|
+import { AddQuestionToExercise } from '@/api/exercise';
|
|
|
+
|
|
|
// 题型源数据
|
|
|
export const questionTypeDataOption = [
|
|
|
{
|
|
@@ -147,10 +149,83 @@ export function getExerciseTypeList(arr) {
|
|
|
export const exerciseTypeList = getExerciseTypeList(questionTypeOption);
|
|
|
|
|
|
/**
|
|
|
+ * 解析智能识别数据
|
|
|
+ * @param {array} arr 智能识别数据
|
|
|
+ * @param {object} data 题目数据
|
|
|
+ * @param {boolean} isEnableReferenceAnswer 是否启用参考答案
|
|
|
+ */
|
|
|
+function analysisRecognition(arr, data, isEnableReferenceAnswer = false) {
|
|
|
+ let sliceLength = 0;
|
|
|
+ const stemReg = /^题干[::]/;
|
|
|
+ if (stemReg.test(arr[0])) {
|
|
|
+ data.stem = arr[0].replace(stemReg, '');
|
|
|
+ sliceLength += 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ const desReg = /^提示[::]/;
|
|
|
+ if (desReg.test(arr[sliceLength])) {
|
|
|
+ data.description = arr[sliceLength].replace(desReg, '');
|
|
|
+ data.property.is_enable_description = 'true';
|
|
|
+ sliceLength += 1;
|
|
|
+ } else {
|
|
|
+ data.description = '';
|
|
|
+ data.property.is_enable_description = 'false';
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isEnableReferenceAnswer) {
|
|
|
+ let referenceReg = /^参考答案[::]/;
|
|
|
+ let index = arr.findIndex((item) => referenceReg.test(item));
|
|
|
+ if (index === -1) {
|
|
|
+ data.reference_answer = '';
|
|
|
+ data.property.is_enable_reference_answer = 'false';
|
|
|
+ } else {
|
|
|
+ data.reference_answer = arr[index].replace(referenceReg, '');
|
|
|
+ data.property.is_enable_reference_answer = 'true';
|
|
|
+ arr.splice(index, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr.slice(sliceLength);
|
|
|
+}
|
|
|
+
|
|
|
+// 问答题、看图说话、看图写作 无单独数据解析函数
|
|
|
+// 各个题型的智能识别数据解析函数
|
|
|
+const analysisFunctions = {
|
|
|
+ select: analysisRecognitionSelectData,
|
|
|
+ judge: analysisRecognitionJudgeData,
|
|
|
+ fill: analysisRecognitionFillData,
|
|
|
+ sort: analysisRecognitionSortData,
|
|
|
+ matching: analysisRecognitionMatchingData,
|
|
|
+ // choose_tone: analysisRecognitionSelectData,
|
|
|
+ table_fill: analysisRecognitionTableFillData,
|
|
|
+ read_aloud: analysisRecognitionReadAloudData,
|
|
|
+ repeat: analysisRecognitionRepeatData,
|
|
|
+ dialogue: analysisRecognitionDialogueData,
|
|
|
+ replace_answer: analysisRecognitionReplaceAnswerData,
|
|
|
+ listen_select: analysisRecognitionListenSelectData,
|
|
|
+ listen_fill: analysisRecognitionListenFillData,
|
|
|
+ listen_judge: analysisRecognitionListenJudgeData,
|
|
|
+ write: analysisRecognitionReadData,
|
|
|
+ read: analysisRecognitionWriteData,
|
|
|
+};
|
|
|
+/**
|
|
|
+ * 获取智能识别各个题型独有的数据解析返回值
|
|
|
+ * @param {array} dataArr 智能识别数据
|
|
|
+ * @param {string} type 题型类型
|
|
|
+ * @returns object
|
|
|
+ */
|
|
|
+function getRecognitionData(dataArr, type) {
|
|
|
+ const analysisFunction = analysisFunctions[type];
|
|
|
+ if (!analysisFunction) return {};
|
|
|
+
|
|
|
+ return analysisFunction(dataArr);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
* 解析一键导入数据
|
|
|
* @param {Array} questionList 题目列表
|
|
|
*/
|
|
|
export function analysisOneKeyImportData(questionList) {
|
|
|
+ let dataList = [];
|
|
|
questionList.forEach((item) => {
|
|
|
let arr = item
|
|
|
.split(/[\r\n]/)
|
|
@@ -158,10 +233,44 @@ export function analysisOneKeyImportData(questionList) {
|
|
|
.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);
|
|
|
|
|
|
- if (!type) return;
|
|
|
+ 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 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,
|
|
|
+ });
|
|
|
});
|
|
|
+
|
|
|
+ return dataList;
|
|
|
}
|