{"version":3,"sources":["webpack:///./src/views/mock/paperTests/compontents/tabCard.vue?fe30","webpack:///./node_modules/core-js/modules/es.object.values.js","webpack:///./src/views/mock/paperTests/util/form.js","webpack:///./node_modules/core-js/internals/object-to-array.js","webpack:///./src/views/mock/paperTests/util/common.js","webpack:///./src/views/mock/paperTests/compontents/tabCard.vue","webpack:///src/views/mock/paperTests/compontents/tabCard.vue","webpack:///./src/views/mock/paperTests/compontents/tabCard.vue?0932","webpack:///./src/views/mock/paperTests/compontents/tabCard.vue?3bbe","webpack:///./src/api/paperMock.js"],"names":["$","$values","values","target","stat","O","FORM_TYPE","INPUT","TWIN_INPUT_START","TWIN_INPUT_END","RADIO","CHECKBOX","MATCH","FILL_STR_TYPE","SINGLE","TWIN_START","TWIN_END","REGEX_FILL_STR","generateQuestion","question","id","audio_url","groups","paraphrase_content","number","content","length","allQuestion","reduce","result","group","question_type","QUESTION_TYPE","NOTCOMPLETION","renderToInput","renderToMatch","MULTIPLEANSWER","MULTIPLECHOICE","TRUROrFALSE","EITHEROR","renderToOption","TITLE","renderToTitle","WRITING","renderToWrite","questionHtml","articleHtml","replaceString","marked","originalQuestionHtml","str","regex","regexBold","regexUnderline","replaceAll","description","note","questions","mode","questionStr","QUESTION_TYPE_MODE","FILL_IN_MULTIPLE_BLANKS_IMAGE","acc","cur","index","arr","fillStrMap","replace","match","replacement","options","MATCH_CHOOSE","replaceImgToA","renderToMatchTable","renderMatchOption","MATCH_TABLE","MATCH_DRAG_TO_QUESTION","titles","MATCH_FILL_IN_BANK","renderToMatchFillInBank","questionNum","questionItemStr","split","a","c","i","option","text","renderTitleOption","option_alias","type","renderToRadio","renderToCheckbox","String","fromCharCode","answerLength","answer","combineOptionStr","name","regexImg","imgTags","src","alt","aTag","matches","exec","push","curUrl","DESCRIPTORS","uncurryThis","objectKeys","toIndexedObject","$propertyIsEnumerable","f","propertyIsEnumerable","createMethod","TO_ENTRIES","it","key","keys","module","exports","entries","init","instance","$route","query","rId","method","EXERCISE_TYPE","MOCK","getMockInfo","getExerciseInfo","params","isContinue","getContinueTestsInfoApi","getBeginTestsInfoApi","Promise","resolve","reject","callback","res","$router","path","stepInfo","find","is_finished","details","recordId","section","getQuestion","getAnswer","answers","getBeginExerciseInfoApi","data","continueExercise","getContinueExerciseInfoApi","spent_second","PART_EXERCISE","record","getQuestionInfoApi","encrypted","JSON","parse","Base64","decode","iv","value","decryptedData","AES","decrypt","getAnswerInfoApi","answerConversion","obj","MOCK_SECTION","READING","Object","_answer","map","item","subQuestion","Number","submitAnswer","val","oldVal","findDiff","submitAnswerApi","question_id","articleList","updateAnswer","$el","initialAnswer","formItemsDom","querySelectorAll","answerMap","Array","isArray","from","forEach","dataset","questionid","formType","questionType","$set","sheet","questionId","inputEvent","e","handleInputAnswer","oninput","radioItemsDom","radioItem","qid","radioEvent","checked","removeEventListener","addEventListener","disableCheckbox","checkedItems","checkboxItemsDom","disabled","canSelectNum","checkboxItem","includes","filter","checkboxEvent","cItem","onchange","initAudio","spentSecond","audioUrls","audioTotalDurations","audio_duration","audioDurationList","window","customTotalTime","currentIndex","audioList","oldCurrentIndex","playCurrentAudio","currentAudio","play","url","audio","Audio","currentTime","volume","document","body","appendChild","getRemainingTime","getCurrentAudio","remainderTime","totalSeconds","residueTime","originInterMinute","Math","floor","interMinute","minutes","seconds","getRemainderTime","A","B","diff","render","_vm","this","_c","_self","staticClass","_l","tabList","class","active","on","$event","tabChange","_v","_s","label","title","_e","_t","staticRenderFns","components","props","defaultActive","default","watch","handler","immediate","methods","component","Fetch","exercise","GROUP_EXERCISE","finishTestApi","debounce","fn","delay","timer","clearTimeout","setTimeout","apply","arguments","customStartTime","Date","getTime","preQuestionId","answerQueue","createUUID","chars","uuid","random","retryCount","submit","retry","cid","LISTENING","Message","message","duration","currentUid","originData","trim","err","code","current","questionNumber","querySelector","getAttribute","showClose","submitDebounced"],"mappings":"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","file":"js/chunk-1c90c744.5a46f7f6.js","sourcesContent":["export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../../node_modules/style-resources-loader/lib/index.js??ref--11-oneOf-1-4!../../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tabCard.vue?vue&type=style&index=0&id=61f1ce64&prod&lang=less&scoped=true&\"","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.es/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","import { QUESTION_TYPE, QUESTION_TYPE_MODE } from \"@/utils/constant\";\nimport marked from \"marked\";\n\n// 表单题目类型\nexport const FORM_TYPE = {\n INPUT: 1,\n TWIN_INPUT_START: 11,\n TWIN_INPUT_END: 12,\n RADIO: 2,\n CHECKBOX: 3,\n MATCH: 4\n};\n\n// 填空字符类型\nexport const FILL_STR_TYPE = {\n SINGLE: \"[i[=NO=]]\",\n TWIN_START: \"[ii[=NO=]\",\n TWIN_END: \"[=NO=]]\"\n};\n// 匹配上面3种类型的正则\nconst REGEX_FILL_STR = /\\[\\w+\\[=\\w+=]]|\\[\\[=\\w+=]]|\\[=\\w+=]]|\\[\\w+\\[=\\w+=]/g;\n\n/**\n * 生成题目 HTML\n * @param {Object} question 题目对象\n * @param {Array} question.groups 题目组\n * @returns {Object} 包含group ID、音频 URL 和 HTML字符串 的对象 articleHtml阅读 originalQuestionHtml原题(写作)\n */\nexport function generateQuestion(question) {\n const {\n id,\n audio_url,\n groups,\n paraphrase_content,\n number,\n content\n } = question;\n if (!groups || !groups.length) {\n return;\n }\n const allQuestion = groups.reduce((result, group) => {\n if (group.question_type === QUESTION_TYPE.NOTCOMPLETION) {\n result += renderToInput(group);\n }\n if (group.question_type === QUESTION_TYPE.MATCH) {\n result += renderToMatch(group);\n }\n if (\n group.question_type === QUESTION_TYPE.MULTIPLEANSWER ||\n group.question_type === QUESTION_TYPE.MULTIPLECHOICE ||\n group.question_type === QUESTION_TYPE.TRUROrFALSE ||\n group.question_type === QUESTION_TYPE.EITHEROR\n ) {\n result += renderToOption(group);\n }\n\n if (group.question_type === QUESTION_TYPE.TITLE) {\n result += renderToTitle(group);\n }\n\n if (group.question_type === QUESTION_TYPE.WRITING) {\n result += renderToWrite(group);\n }\n return result;\n }, \"\");\n\n const questionHtml =\n `

Part ${number} ${paraphrase_content}


` +\n allQuestion;\n\n return {\n id,\n audio_url,\n articleHtml: replaceString(marked(content)),\n originalQuestionHtml: replaceString(allQuestion),\n questionHtml: replaceString(questionHtml)\n };\n}\n\n/**\n * @description 转换字符串内标识符\n */\nfunction replaceString(str) {\n const regex = /\\[HLS\\[[^\\]]*\\]\\]/g;\n const regexBold = /\\*{1,2}([^*]+)\\*{1,2}/g;\n const regexUnderline = /\\[u\\[\\s*(.*?)\\s*\\]\\]/g;\n\n return str\n .replaceAll(\"[d[=NO=]]\", \" \")\n .replaceAll(regex, \"\")\n .replaceAll(regexBold, \"$1\")\n .replaceAll(regexUnderline, \"$1\");\n}\n\n/**\n * @description 转成input\n * @param {String} group 题目字符串\n * @returns {String} 转换后的字符串\n */\nexport function renderToInput(group) {\n const { content, description, note, questions, mode } = group;\n let questionStr = \"\";\n // 兼容图片填空题\n if (+mode === +QUESTION_TYPE_MODE.FILL_IN_MULTIPLE_BLANKS_IMAGE) {\n questionStr = questions.reduce((acc, cur, index, arr) => {\n if (index < arr.length) {\n const { number, id } = questions[index];\n acc += `

${number}.

`;\n }\n return acc;\n }, \"\");\n questionStr = marked(content) + questionStr;\n } else {\n questionStr = marked(content);\n let index = 0;\n const fillStrMap = {\n [FILL_STR_TYPE.SINGLE]: FORM_TYPE.INPUT,\n [FILL_STR_TYPE.TWIN_START]: FORM_TYPE.TWIN_INPUT_START,\n [FILL_STR_TYPE.TWIN_END]: FORM_TYPE.TWIN_INPUT_END\n };\n questionStr = questionStr.replace(REGEX_FILL_STR, match => {\n if (!questions[index]) {\n return \"\";\n }\n const { number, id } = questions[index];\n const replacement = `${number}. `;\n if (match !== FILL_STR_TYPE.TWIN_START) {\n index++;\n }\n return replacement;\n });\n }\n\n return `
${note}

${marked(\n description\n )}
${questionStr}
`;\n}\n\n/**\n * @description 转成match匹配题\n */\nexport function renderToMatch(group) {\n const { description, note, questions, options, mode, content } = group;\n let questionStr = \"\";\n\n if (mode === +QUESTION_TYPE_MODE.MATCH_CHOOSE) {\n questionStr =\n `
${marked(replaceImgToA(content))}
` +\n questions.reduce((acc, cur) => {\n acc += renderToMatchTable(cur);\n return acc;\n }, \"\") +\n renderMatchOption(options);\n }\n\n if (mode === +QUESTION_TYPE_MODE.MATCH_TABLE) {\n questionStr =\n `
${marked(replaceImgToA(content))}
` +\n questions.reduce((acc, cur) => {\n acc += renderToMatchTable(cur);\n return acc;\n }, \"\");\n }\n\n if (mode === +QUESTION_TYPE_MODE.MATCH_DRAG_TO_QUESTION) {\n const regex = /<\\w+[^>]*>.*?<\\/\\w+>/g;\n const titles = marked(replaceImgToA(content)).match(regex);\n\n questionStr =\n (titles ? titles[0] : \"\") +\n questions.reduce((acc, cur) => {\n acc += renderToMatchTable(cur);\n return acc;\n }, \"\") +\n (titles ? titles[1] : \"\") +\n renderMatchOption(options);\n }\n if (mode === +QUESTION_TYPE_MODE.MATCH_FILL_IN_BANK) {\n questionStr =\n renderToMatchFillInBank(replaceImgToA(content), questions) +\n renderMatchOption(options);\n }\n\n const questionNum = questions.length\n ? `${questions[0].number} ~ ${questions[questions.length - 1].number}`\n : \"\";\n\n return `
${note}

\n
\n question ${questionNum}:\n
${marked(description)}
\n
\n ${questionStr}\n
\n
\n
`;\n}\n\nfunction renderToMatchTable(cur) {\n const questionItemStr =\n cur.content.replaceAll(\"[d[=NO=]]\", \" \") +\n `${cur.number}. `;\n return `
• ${questionItemStr}

`;\n}\nfunction renderToMatchFillInBank(content, questions) {\n return marked(content)\n .split(\"[d[=NO=]]\")\n .reduce((a, c, i, arr) => {\n a += c;\n if (i < arr.length - 1) {\n const { number, id } = questions[i];\n a += `${number}. `;\n }\n return a;\n }, \"\");\n}\n\n/**\n * @description 匹配题选项\n */\nfunction renderMatchOption(options) {\n return `
${options.reduce(\n (acc, cur) => {\n acc += `

${cur.option}. ${cur.text}

`;\n return acc;\n },\n \"\"\n )}
`;\n}\n\n/**\n * @description 标题题选项\n */\nfunction renderTitleOption(options) {\n return `
${options.reduce(\n (acc, cur) => {\n acc += `

${cur.option_alias ||\n cur.option} . ${cur.text}

`;\n return acc;\n },\n \"\"\n )}
`;\n}\n\n/**\n * @description 转成选项题\n */\nexport function renderToOption(group) {\n const { description, note, options, questions } = group;\n const questionStr = questions.reduce((acc, cur) => {\n const { type } = cur;\n if (\n type === QUESTION_TYPE.MULTIPLECHOICE ||\n type === QUESTION_TYPE.TRUROrFALSE ||\n type === QUESTION_TYPE.EITHEROR\n ) {\n acc += renderToRadio(cur);\n } else {\n acc += renderToCheckbox(cur);\n }\n\n return acc;\n }, \"\");\n\n return `
${note}

${marked(\n description\n )}
${questionStr}
`;\n}\n\n/**\n * @description 转成标题题\n */\nexport function renderToTitle(group) {\n const { content, description, note, questions, options } = group;\n const questionStr = questions.reduce((acc, cur, index) => {\n const { number, id } = cur;\n acc += `

【${String.fromCharCode(\n 65 + index\n )}】${number}.

`;\n return acc;\n }, \"\");\n return (\n `
${note}

${marked(description)}
${questionStr}
` +\n `${marked(content)}
` +\n renderTitleOption(options) +\n \"
\"\n );\n}\n\n/**\n * @description 转成checkbox多选题\n */\nexport function renderToCheckbox(cur) {\n const answerLength = cur.answer.length;\n const number =\n answerLength > 1\n ? cur.number + \" ~ \" + (cur.number + answerLength - 1)\n : cur.number;\n return `
\n
\n question ${number}:\n ${marked(cur.content)} \n
\n
\n ${combineOptionStr(cur.id, cur.options, \"checkbox\")}\n
\n
`;\n}\n\n/**\n * @description 转成radio单选题\n */\nexport function renderToRadio(cur) {\n return `
\n
\n question ${cur.number}:\n ${marked(cur.content)}\n
\n
\n ${combineOptionStr(cur.id, cur.options, \"radio\")}\n
\n
`;\n}\n\n/**\n * @description 组合选项字符串\n * @param {Array} options 选项数组\n * @param {String} name 选项name\n * @param {String} type radio | checkbox\n * @returns {String} option组合后的字符串\n */\nfunction combineOptionStr(name, options, type) {\n return options.reduce((a, c) => {\n a += `
\n \n
`;\n return a;\n }, \"\");\n}\n\nfunction renderToWrite(group) {\n const { questions } = group;\n\n return questions.reduce((acc, cur) => {\n acc += marked(cur.content);\n const regexImg = //g;\n const imgTags = acc.match(regexImg) || [];\n for (let i = 0; i < imgTags.length; i++) {\n const src = imgTags[i].match(/src=\"([^\"]+)\"/)[1];\n const alt = imgTags[i].match(/alt=\"([^\"]+)\"/)[1];\n const aTag = `\"${alt}\"`;\n acc = acc.replace(imgTags[i], aTag);\n }\n return acc;\n }, \"\");\n}\n\n/**\n * @description 匹配图片,并替换为a标签\n */\nexport function replaceImgToA(str) {\n const regex = /!\\[.*?\\]\\((https?:\\/\\/[^\\s]+)\\)/g;\n const matches = [];\n\n let match;\n while ((match = regex.exec(str)) !== null) {\n matches.push(match);\n }\n\n return matches.reduce((acc, cur) => {\n const curUrl = cur[1];\n const aTag = `\"点击查看大图\"`;\n acc = acc.replace(cur[0], aTag);\n return acc;\n }, str);\n}\n","var DESCRIPTORS = require('../internals/descriptors');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar $propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\nvar propertyIsEnumerable = uncurryThis($propertyIsEnumerable);\nvar push = uncurryThis([].push);\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable(O, key)) {\n push(result, TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.es/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.es/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","import {\n getAnswerInfoApi,\n getBeginTestsInfoApi,\n getContinueTestsInfoApi,\n getContinueExerciseInfoApi,\n getQuestionInfoApi,\n submitAnswerApi,\n getBeginExerciseInfoApi\n} from \"@/api/paperMock\";\nimport { Base64 } from \"js-base64\";\nimport AES from \"@/utils/AES\";\nimport { FORM_TYPE } from \"@/views/mock/paperTests/util/form\";\nimport { EXERCISE_TYPE, MOCK_SECTION, QUESTION_TYPE } from \"@/utils/constant\";\n\n/**\n * @description 初始化获取试卷信息\n * @param {Object} instance vue实例\n * @returns {Promise} promise => {question, content, stepInfo}\n */\nexport async function init(instance) {\n const { rId, type } = instance.$route.query;\n const method = +type === +EXERCISE_TYPE.MOCK ? getMockInfo : getExerciseInfo;\n return await method(instance, rId);\n}\n\n/**\n * @description 获取模考信息\n */\nfunction getMockInfo(instance, rId) {\n let id = rId ? rId : instance.$route.params.id;\n const isContinue = !!rId;\n const method = isContinue ? getContinueTestsInfoApi : getBeginTestsInfoApi;\n\n return new Promise((resolve, reject) => {\n method({\n id,\n callback: async res => {\n if (!res) {\n return;\n }\n if (!isContinue) {\n id = res.id\n instance.$router.replace({\n path: instance.$route.path,\n params: instance.$route.params,\n query: {\n ...instance.$route.query,\n rId: res.id\n }\n });\n }\n // if( toString.call(res) === '[object Object]' ) return\n const stepInfo = isContinue\n ? res.find(f => !f.is_finished) || res[0]\n : res.details[0];\n stepInfo.recordId = id\n stepInfo.section = instance.section\n const questions = await getQuestion(stepInfo);\n const answers = await getAnswer(stepInfo);\n\n resolve({\n questions,\n answers,\n stepInfo\n });\n }\n });\n });\n}\n/**\n * @description 获取练习信息\n */\nfunction getExerciseInfo(instance, rId) {\n const id = rId ? rId : instance.$route.params.id;\n const type = instance.$route.query.type;\n const isContinue = !!rId;\n\n return new Promise(async (resolve, reject) => {\n if (!isContinue) {\n await getBeginExerciseInfoApi({\n id,\n type,\n params:{\n section: instance.section\n },\n callback: async data => {\n instance.$router.replace({\n path: instance.$route.path,\n params: instance.$route.params,\n query: {\n ...instance.$route.query,\n rId: data.id\n }\n });\n const res = await continueExercise(data.id, instance.section);\n resolve(res);\n }\n });\n } else {\n const res = await continueExercise(id, instance.section);\n resolve(res);\n }\n });\n\n function continueExercise(id, section) {\n return new Promise(resolve => {\n getContinueExerciseInfoApi({\n id,\n callback: async ({ answers, id, spent_second }) => {\n const stepInfo = {\n recordId:id,\n spent_second,\n section\n };\n\n const questions = await getQuestion(\n stepInfo,\n EXERCISE_TYPE.PART_EXERCISE\n );\n resolve({\n answers,\n stepInfo,\n questions\n });\n }\n });\n });\n }\n}\n\n/**\n * @description 获取题目信息\n */\nfunction getQuestion(stepInfo, type = EXERCISE_TYPE.MOCK) {\n let record = {\n section:stepInfo.section,\n recordId: stepInfo.recordId\n }\n return new Promise(resolve => {\n getQuestionInfoApi({\n record,\n type,\n callback: ({ encrypted }) => {\n const { iv, value } = JSON.parse(Base64.decode(encrypted));\n const decryptedData = JSON.parse(AES.decrypt(value, \"\", \"CBC\", iv));\n resolve(decryptedData);\n }\n });\n });\n}\n\n/**\n * @description 获取答案信息\n */\nfunction getAnswer(stepInfo) {\n return new Promise(resolve => {\n getAnswerInfoApi({\n record: {\n section:stepInfo.section,\n recordId: stepInfo.recordId\n },\n callback: res => {\n resolve(res);\n }\n });\n });\n}\n\nfunction answerConversion(question,section, obj){\n if(section !== MOCK_SECTION.READING) return Object.values(obj)[0]\n //阅读题,且当前题目类型是 标题题的时候,需要进行答案转换\n let _answer = Object.values(obj)[0]\n question.map(item=>{\n item.groups?.map(group=>{\n if( group.question_type !== QUESTION_TYPE.TITLE ) return\n group.questions.map(subQuestion=>{\n if(subQuestion.id === Number(Object.keys(obj)[0])){\n _answer = group.options.find(f=>f.option_alias === Object.values(obj)[0]).option\n }\n })\n })\n })\n return _answer\n}\n\n/**\n * @description 提交答案\n */\nexport function submitAnswer(instance, stepInfo, val, oldVal) {\n const obj = findDiff(val, oldVal);\n \n submitAnswerApi({\n id: stepInfo.recordId,\n type: instance.$route.query.type,\n data: {\n question_id: Object.keys(obj)[0],\n content: answerConversion(instance.articleList,stepInfo.section, obj),\n section: stepInfo.section,\n spent_second: instance.spent_second\n }\n });\n}\n\n/**\n * @description 更新答案信息\n * @param {Object} instance vue实例\n * @param {Element} $el dom元素\n * @param {Array, Object} initialAnswer 答案数组或对象 用于更新答案\n */\nexport function updateAnswer(instance, $el, initialAnswer = []) {\n const formItemsDom = $el.querySelectorAll(\"[data-questionid]\");\n\n const answerMap = Array.isArray(initialAnswer)\n ? initialAnswer.reduce((acc, cur) => {\n acc[cur.question_id] = cur.content;\n return acc;\n }, {})\n : initialAnswer;\n\n Array.from(formItemsDom).forEach(item => {\n // 处理questionid\n const value = answerMap[item.dataset.questionid] || \"\";\n const formType = item.dataset.questionType;\n // 为提高性能,answers不深度监听\n instance.answers[item.dataset.questionid] = value;\n instance.$set(instance.sheet, item.dataset.questionid, {\n number: item.dataset.number,\n questionId: item.dataset.questionid,\n formType: item.dataset.questionType,\n value\n });\n\n // 绑定事件\n // 填空题 和 匹配题\n if (\n +formType === +FORM_TYPE.INPUT ||\n +formType === +FORM_TYPE.MATCH ||\n +formType === +FORM_TYPE.TWIN_INPUT_START ||\n +formType === +FORM_TYPE.TWIN_INPUT_END\n ) {\n // 联合填空题\n if (+formType === +FORM_TYPE.TWIN_INPUT_START) {\n item.value = value.split(\"|\")[0] || \"\";\n } else if (+formType === +FORM_TYPE.TWIN_INPUT_END) {\n item.value = value.split(\"|\")[1] || \"\";\n } else {\n item.value = value;\n }\n function inputEvent(e) {\n const oldVal = instance.sheet[e.target.dataset.questionid].value;\n // 防止重复提交\n if (e.target.value === instance.answers[e.target.dataset.questionid]) {\n return;\n }\n // // todo: 优化\n instance.answers = {\n ...instance.answers,\n [e.target.dataset.questionid]: handleInputAnswer(e.target.value, oldVal, +formType)\n };\n instance.sheet[e.target.dataset.questionid].value = handleInputAnswer(e.target.value, oldVal, +formType);\n }\n\n if (!item.oninput) {\n item.oninput = inputEvent;\n }\n }\n\n // 单选题\n if (+formType === +FORM_TYPE.RADIO) {\n const radioItemsDom = item.querySelectorAll(\"[data-option]\");\n radioItemsDom.forEach(radioItem => {\n const value = radioItem.dataset.option;\n const qid = radioItem.name;\n if (value === instance.answers[qid]) {\n radioItem.checked = true;\n }\n function radioEvent(e) {\n instance.answers = {\n ...instance.answers,\n [qid]: value\n };\n instance.sheet[qid].value = value;\n }\n radioItem.removeEventListener(\"change\", radioEvent);\n radioItem.addEventListener(\"change\", radioEvent);\n });\n }\n\n // 多选题\n if (+formType === +FORM_TYPE.CHECKBOX) {\n const canSelectNum = item.dataset.canSelectNum;\n const checkboxItemsDom = item.querySelectorAll(\"[data-option]\");\n\n // checkedItems 选中的checkbox\n function disableCheckbox(checkedItems) {\n Array.from(checkboxItemsDom).forEach(f => {\n f.disabled = checkedItems.length >= canSelectNum && !f.checked;\n });\n }\n\n checkboxItemsDom.forEach(checkboxItem => {\n const qid = checkboxItem.name;\n const value = checkboxItem.dataset.option;\n if (instance.answers[qid] && instance.answers[qid].includes(value)) {\n checkboxItem.checked = true;\n const checkedItems = Array.from(checkboxItemsDom).filter(\n f => f.checked\n );\n disableCheckbox(checkedItems);\n }\n\n function checkboxEvent(e) {\n const checkedItems = Array.from(checkboxItemsDom).filter(\n f => f.checked\n );\n disableCheckbox(checkedItems);\n instance.answers = {\n ...instance.answers,\n [qid]: checkedItems\n .map(cItem => cItem.dataset.option)\n .reduce((a, c) => a + c, \"\")\n };\n instance.sheet[qid].value = instance.answers[qid];\n }\n\n if (!item.onchange) {\n item.onchange = checkboxEvent;\n }\n });\n }\n });\n}\n\n/**\n * @description 初始化音频\n * @param {Array} questions 题目数组\n * @param {Object} stepInfo 当前步骤信息\n * @returns {Function} 返回一个函数,每次调用都会返回剩余时间 和当前音频\n */\nexport function initAudio(questions, stepInfo) {\n const spentSecond = stepInfo.spent_second || 0;\n const {\n audioUrls,\n audioTotalDurations,\n audioDurationList\n } = questions.reduce(\n (acc, cur) => {\n if (cur.audio_url) {\n acc.audioUrls.push(cur.audio_url);\n acc.audioTotalDurations += cur.audio_duration;\n acc.audioDurationList.push(cur.audio_duration);\n }\n return acc;\n },\n { audioUrls: [], audioTotalDurations: 120, audioDurationList: [] }\n );\n window.customTotalTime = audioTotalDurations;\n\n let currentIndex =\n audioDurationList.reduce((acc, cur) => {\n if (acc + cur < spentSecond) {\n acc++;\n }\n return acc;\n }, 0) || 0;\n const audioList = [];\n // 保存第一个音频的索引\n const oldCurrentIndex = currentIndex;\n\n // 创建所有音频元素并添加到页面中\n audioUrls.forEach((url, i) => {\n const audio = new Audio(url);\n audio.id = 'paperAudio'\n // 通过spentSecond设置当前音频的播放位置\n audio.currentTime =\n i < currentIndex\n ? audioDurationList[i]\n : i > currentIndex\n ? 0\n : spentSecond -\n audioDurationList.reduce((acc, cur, index) => {\n if (index < currentIndex) {\n acc += audioDurationList[index];\n }\n return acc;\n }, 0);\n audio.volume = 0.5;\n audioList.push(audio);\n document.body.appendChild(audio);\n });\n\n // 开始or继续 播放\n playCurrentAudio();\n\n // 播放当前音频并监听结束事件\n function playCurrentAudio() {\n const currentAudio = audioList[currentIndex];\n // 如果当前音频存在并且不是第一个音频就自动播放\n if (currentAudio && currentIndex !== oldCurrentIndex) {\n currentAudio.play();\n }\n currentIndex++;\n if (currentIndex < audioList.length) {\n currentAudio.addEventListener(\"ended\", playCurrentAudio);\n }\n }\n return {\n getRemainingTime: getRemainingTime(spentSecond, audioTotalDurations),\n getCurrentAudio: () => audioList[currentIndex - 1]\n };\n}\n\n/**\n * @description 计算剩余时间\n * @param spentSecond 已用时间\n * @param totalSeconds 总时间\n * @returns {function(): {seconds: string, minutes: string|number, interMinute: number}} 返回一个函数,每次调用都会返回剩余时间\n */\nlet remainderTime = 0\nexport function getRemainingTime(spentSecond, totalSeconds) {\n let residueTime = totalSeconds + 1 - spentSecond;\n return () => {\n residueTime--;\n remainderTime = residueTime\n // 为了兼容老机考的头部倒计时逻辑\n const originInterMinute = Math.floor(residueTime / 60)\n const interMinute = originInterMinute + 1;\n const minutes = originInterMinute < 0 ? \"00\" : (originInterMinute < 10 ? \"0\" + originInterMinute : originInterMinute);\n const seconds =\n residueTime < 0 ? '00' : (residueTime % 60 < 10 ? \"0\" + (residueTime % 60) : residueTime % 60);\n return { interMinute, minutes, seconds };\n };\n}\n\nexport function getRemainderTime() {\n return remainderTime\n}\n\n/**\n * @description 找出A对象对比B对象值改变的那一项\n */\nexport function findDiff(A, B) {\n const diff = {};\n Object.keys(A).forEach(key => {\n if (A[key] !== B[key]) {\n diff[key] = A[key];\n }\n });\n return diff;\n}\n\n/**\n * @description 处理填空和联合填空题的答案\n * @param {String} value 当前输入框的值formType\n * @param {String} oldVal 旧值\n * @param {Number} formType 表单类型\n */\nexport function handleInputAnswer(value, oldVal, formType) {\n if (formType === FORM_TYPE.TWIN_INPUT_START) {\n return `${value}|${oldVal.split(\"|\")[1] || \"\"}`;\n } else if (formType === FORM_TYPE.TWIN_INPUT_END) {\n return `${oldVal.split(\"|\")[0] || \"\"}|${value}`;\n }\n return value;\n}\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"tab-card-swapper\"},[_c('div',{staticClass:\"tab-list\"},_vm._l((_vm.tabList),function(item){return _c('div',{key:item.value,staticClass:\"label\",class:{ active: _vm.active === item.value },on:{\"click\":function($event){return _vm.tabChange(item)}}},[_vm._v(\" \"+_vm._s(item.label)+\" \")])}),0),_c('div',{staticClass:\"card-content\"},[(_vm.title)?_c('div',{staticClass:\"title-box\"},[_vm._v(_vm._s(_vm.title))]):_vm._e(),_c('div',{staticClass:\"content\"},[_vm._t(\"default\")],2)])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tabCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js!../../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./tabCard.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./tabCard.vue?vue&type=template&id=61f1ce64&scoped=true&\"\nimport script from \"./tabCard.vue?vue&type=script&lang=js&\"\nexport * from \"./tabCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./tabCard.vue?vue&type=style&index=0&id=61f1ce64&prod&lang=less&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"61f1ce64\",\n null\n \n)\n\nexport default component.exports","import Fetch from \"@/utils/fetch\";\nimport { EXERCISE_TYPE, MOCK_SECTION } from \"@/utils/constant\";\nimport { Message } from \"element-ui\";\n\nexport const getBeginTestsInfoApi = ({id, callback}) => {\n new Fetch(`papers/${id}/mock_records`, \"post\", \"\", callback, null, \"v1\",true);\n};\nexport const getContinueTestsInfoApi = ({id, callback}) => {\n new Fetch(`mock_records/${id}/details`, \"get\", \"\", callback, null, \"v1\",true);\n};\n\nexport const getQuestionInfoApi = ({record, callback, type = EXERCISE_TYPE.MOCK}) => {\n const path = +type === +EXERCISE_TYPE.MOCK ? `mock_records/${record.recordId}/sections/${record.section}` : `exercise_records/${record.recordId}`;\n new Fetch(`${path}/questions`, \"get\", \"\", callback, null, \"v1\",true);\n};\n\nexport const getAnswerInfoApi = ({record, callback}) => {\n new Fetch(`mock_records/${record.recordId}/sections/${record.section}/answers`, \"get\", \"\", callback, null, \"v1\",true);\n}\n\nexport const getBeginExerciseInfoApi = ({id, type, params,callback}) => {\n let exercise = ''\n switch(+type){\n case +EXERCISE_TYPE.GROUP_EXERCISE:\n exercise = 'groups'\n break;\n case +EXERCISE_TYPE.PART_EXERCISE:\n exercise = 'parts'\n break;\n default:\n exercise = 'papers'\n }\n new Fetch(`${exercise}/${id}/exercise_records`, \"post\", params, callback, null, \"v1\",true);\n}\nexport const getContinueExerciseInfoApi = ({id, callback }) => {\n new Fetch(`exercise_records/${id}`, \"get\", \"\", callback, null, \"v1\",true);\n}\n\nexport const finishTestApi = ({record, callback, type = EXERCISE_TYPE.MOCK, }) => {\n const path = +type === +EXERCISE_TYPE.MOCK ? `mock_records/${record.recordId}/sections/${record.section}/details` : `exercise_records/${record.recordId}`;\n new Fetch(`${path}/finish`, \"put\", \"\", callback, null, \"v1\",true);\n};\n\nfunction debounce(fn, delay) {\n let timer = null;\n return function () {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n fn.apply(this, arguments);\n }, delay);\n };\n}\n\nwindow.customStartTime = new Date().getTime();\nlet preQuestionId = null;\n// 答案队列\nlet answerQueue = [];\nfunction createUUID() {\n const chars =\n \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n let uuid = \"\";\n for (let i = 0; i < 32; i++) {\n uuid += chars[Math.floor(Math.random() * 16)];\n }\n return uuid;\n}\n\n// 提交失败重试次数\nconst retryCount = 3;\nfunction submit({ id, data, callback, type }, retry = retryCount, cid) {\n return new Promise((resolve, reject) => {\n if (!data.content) {\n // reject('答案不能为空');\n return;\n }\n window.customStartTime = new Date().getTime();\n // 考试时间是否已过\n if (\n (data?.section === MOCK_SECTION.LISTENING &&\n data.spent_second > window.customTotalTime) ||\n (data?.section === MOCK_SECTION.READING && data.spent_second > 3600) ||\n (data?.section === MOCK_SECTION.WRITING && data.spent_second > 3600)\n ) {\n Message({\n type: \"error\",\n message: \"当前section时间已超时,请选择完成或重新开始~\",\n duration: 5000\n });\n return;\n }\n\n const currentUid = cid || createUUID();\n if (retry === retryCount) {\n answerQueue.push({\n currentUid,\n originData: {id, data, callback, type}\n });\n }\n const path =\n +type === +EXERCISE_TYPE.MOCK ? \"mock_records\" : \"exercise_records\";\n new Fetch(\n `${path}/${id}/answer`,\n \"put\",\n {\n ...data,\n content: data.content.trim(),\n },\n () => {\n answerQueue = answerQueue.filter(item => item.currentUid !== currentUid);\n callback && callback();\n resolve()\n },\n async (err) => {\n // code 60001 当前section结束\n if (err.code === 60001) {\n Message({\n type: \"error\",\n message: \"当前section时间已超时,请选择完成或重新开始~\",\n duration: 5000\n });\n } else {\n const current = answerQueue.find(\n item => item.currentUid === currentUid\n );\n if (retry && retry > 0) {\n await submit(current.originData, retry - 1, current.currentUid);\n } else {\n const questionNumber = document\n .querySelector(`[data-questionid=\"${data.question_id}\"]`)\n .getAttribute(\"data-number\");\n Message({\n type: \"error\",\n message: questionNumber\n ? `由于网络原因,第${questionNumber}题 答案提交失败,请重新作答`\n : \"由于网络原因,答案提交失败,请重新作答\",\n showClose: true\n });\n }\n }\n },\n \"v1\",\n true\n );\n })\n}\n\nconst submitDebounced = debounce(submit, 500);\n\nexport const submitAnswerApi = async ({\n id,\n data,\n callback,\n type = EXERCISE_TYPE.MOCK\n}) => {\n if (preQuestionId !== data.question_id) {\n await submit({ id, data, callback, type });\n } else {\n await submitDebounced({ id, data, callback, type });\n }\n preQuestionId = data.question_id;\n};\n"],"sourceRoot":""}