From cf6e9bcbfc64019bb14fb0964576ae3e3bd2fde5 Mon Sep 17 00:00:00 2001 From: 闫增涛 <1829501689@qq.com> Date: 星期三, 26 三月 2025 11:22:20 +0800 Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/testbookLayout --- src/components/examinations/index.vue | 370 ++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 300 insertions(+), 70 deletions(-) diff --git a/src/components/examinations/index.vue b/src/components/examinations/index.vue index d6d99a8..95c9fe5 100644 --- a/src/components/examinations/index.vue +++ b/src/components/examinations/index.vue @@ -2,22 +2,37 @@ <div class="examination" v-loading="loading"> <div v-for="(item, nindex) in cardData" - :key="nindex" + :key="nindex + 'item'" class="border-box" v-show="item.infoList.length" > <p class="catalogName" :style="{ color: primaryColor }"> - <span v-if="nindex == 0">涓�銆�</span> - <span v-if="nindex == 1">浜屻��</span> - <span v-if="nindex == 2">涓夈��</span> - <span v-if="nindex == 3">鍥涖��</span> - <span v-if="nindex == 4">浜斻��</span> - <span>{{ item.catalogName }}</span> + <span class="catalogName-box"> + <span v-if="nindex == 0">涓�銆�</span> + <span v-if="nindex == 1">浜屻��</span> + <span v-if="nindex == 2">涓夈��</span> + <span v-if="nindex == 3">鍥涖��</span> + <span v-if="nindex == 4">浜斻��</span> + <span v-html="item.catalogName"></span> + </span> + <img + :src="item.isCollect ? isHeart : heart" + alt="" + class="collect-png" + @click="setCollect(nindex, index)" + v-if="!hideCollect && item.type == 'material'" + /> </p> + <el-image + v-if="item.catalogImage" + :src="item.catalogImage" + :preview-src-list="[item.catalogImage]" + class="catalogImage" + ></el-image> <ul> <li v-for="(value, index) in item.infoList" - :key="value.id" + :key="index + 'value'" :id="'listItem-' + value.id" > <!-- 鏍囬 --> @@ -26,23 +41,28 @@ <span class="questionNum" :style="{ - marginTop: value.questionType == 'completion' ? '12px' : '0', + marginTop: + value.questionType == 'completion' || + value.questionType == 'mathField' + ? '12px' + : '0', }" >{{ index + 1 }}. </span> <!-- 鍚姏杩涘害鏉� --> <!-- <answerAudioPlayer :audioUrl="value.src" v-show="item.name == '鍚姏棰�'" /> --> - <!-- 棰樺共 --> <!-- 浠呮枃瀛� --> <p - class="titleText" + class="titleText text-fl" v-if=" - value.stemStyle == 'Txt' && value.questionType != 'completion' + value.stemStyle == 'Txt' && + value.questionType != 'completion' && + value.questionType != 'dropdown' && + value.questionType != 'mathField' " :id="value.id" - > - {{ value.stem.stemTxt }} - </p> + v-html="value.stem.stemTxt" + ></p> <!-- 浠呭浘鐗� --> <el-image class="stemImg" @@ -55,7 +75,7 @@ class="stemTxtAndImage titleText" v-else-if="value.stemStyle == 'TxtAndImage'" > - <span> {{ value.stem.stemTxt }}</span> + <span v-html="value.stem.stemTxt"> </span> <el-image :src="getPublicImage(value.stem.stemImage, 150)" :preview-src-list="[getPublicImage(value.stem.stemImage)]" @@ -63,25 +83,44 @@ ></el-image> </p> <!-- 濉┖棰橀骞� --> - <p class="titleText" v-if="value.questionType == 'completion'"> + <p + class="titleText" + v-if=" + value.questionType == 'completion' || + value.questionType == 'mathField' + " + > <span v-for="(itemText, indexText) in value.stem" - :key="indexText" + :key="indexText + 'questionType'" > <span v-if="typeof itemText == 'string'" v-html="itemText" + class="input-txt" ></span> - <!-- --> <input - v-else + v-if=" + typeof itemText != 'string' && + value.questionType == 'completion' + " type="text" class="input" v-model.trim="value.userAnswer[itemText.num]" :disabled="value.isComplete" :style="{ backgroundColor: inputBc }" /> - <!-- --> + <math-field + v-if=" + typeof itemText != 'string' && + value.questionType == 'mathField' + " + class="mathField" + :menuItems="[]" + @input="onChangeInput($event, nindex, index, itemText.num)" + > + {{ value.userAnswer[itemText.num] }} + </math-field> </span> </p> <!-- 瀵屾枃鏈� --> @@ -91,13 +130,38 @@ v-html="value.stem.stemTxt" v-cloak ></p> + <!-- 涓嬫媺閫夋嫨棰� --> + <p class="titleText" v-if="value.questionType == 'dropdown'"> + <span + v-for="(itemText, indexText) in value.stem" + :key="indexText + 'questionType'" + > + <span + v-if="typeof itemText == 'string'" + v-html="itemText" + class="input-txt" + ></span> + <select + v-else + v-model="value.userAnswer" + :disabled="value.isComplete" + > + <option + v-for="(citem, cindex) in value.option" + :key="cindex + 'dropdown'" + :label="citem" + :value="citem" + ></option> + </select> + </span> + </p> </div> <img :src="value.isCollect ? isHeart : heart" alt="" class="collect-png" @click="setCollect(nindex, index)" - v-if="!(hideCollect && value.questionType == 'shortAnswer')" + v-if="!hideCollect && item.type != 'material'" /> <!-- 鏀惰棌 --> </div> @@ -113,8 +177,8 @@ v-model="value.userAnswer" > <el-radio - v-for="content in value.option" - :key="content.value" + v-for="(content, contentIndex) in value.option" + :key="contentIndex + 'contentIndex'" :label="content.value" :class=" value.optionStyle == 'Image' || @@ -135,14 +199,9 @@ :src="getPublicImage(content.img, 115)" v-show="content.img" :preview-src-list="[getPublicImage(content.img)]" - v-if="isReal" + v-if="sourceType == 'bits'" ></el-image> - <img - :src="content.img" - alt="" - v-if="!isReal" - class="radio-img" - /> + <img :src="content.img" alt="" v-else class="radio-img" /> </p> <p class="optionContent" @@ -172,8 +231,8 @@ v-else-if="value.questionType == 'multipleChoice'" > <el-checkbox - v-for="content in value.option" - :key="content.value" + v-for="(content, contentCindex) in value.option" + :key="contentCindex + 'contentCindex'" :label="content.value" :name="content.text" :class=" @@ -217,17 +276,16 @@ </el-checkbox> </el-checkbox-group> <!-- 绠�绛� 缈昏瘧 --> - <!-- <TEditorVue - v-else-if="value.questionType == 'shortAnswer'" - :value="value.userAnswer" - :disabled="value.isComplete" - @getContent=" - (val) => { - value.userAnswer = val.trim(); - inputChange(); - } - " - ></TEditorVue> --> + <TEditorVue + v-else-if="value.questionType == 'formula'" + :value="value.userAnswer" + :disabled="value.isComplete" + @getContent=" + (val) => { + value.userAnswer = val; + } + " + /> <el-input :disabled="value.isComplete" style="width: 94%; margin: 0 auto" @@ -243,7 +301,8 @@ type != 'mock' && (value.questionType == 'shortAnswer' || value.questionType == 'multipleChoice' || - value.questionType == 'completion') + value.questionType == 'completion' || + value.questionType == 'mathField') " > <el-button @click="checkPares(value)" style="margin-top: 10px" @@ -254,9 +313,11 @@ <div class="analysis" v-if="value.isComplete"> <el-collapse v-model="value.isUnfold" - @change="handleChange(value)" accordion - v-if="value.questionType != 'shortAnswer'" + v-if=" + value.questionType != 'shortAnswer' && + value.questionType != 'formula' + " > <el-collapse-item :name="value.id" class="objective"> <template #title> @@ -355,8 +416,8 @@ ></div> <div v-else>鏆傛棤鏁版嵁</div> </el-collapse-item> - <!-- 涓昏棰� --> </el-collapse> + <!-- 涓昏棰� --> <el-collapse v-else v-model="value.isUnfold" accordion> <el-collapse-item :name="value.id" class="objective"> <template #title> @@ -384,7 +445,6 @@ <div class="referBox" v-if="value.analysisCon"> <span>瑙f瀽锛�</span> <p - v-if="value.analysisCon" v-html="value.analysisCon" :class=" [ @@ -394,7 +454,6 @@ ].join(' ') " ></p> - <p v-else class="ti-2">鏆傛棤鏁版嵁</p> </div> </el-collapse-item> </el-collapse> @@ -491,9 +550,12 @@ </template> <script> +import { MathfieldElement } from "mathlive"; import { Message } from "element-ui"; +import TEditorVue from "../teditor/index.vue"; export default { name: "examination-option", + components: { TEditorVue }, props: { cardList: { type: Array, @@ -507,10 +569,6 @@ }, page: { type: Number, - }, - isReal: { - type: Boolean, - default: true, }, inputBc: { type: String, @@ -574,6 +632,24 @@ this.getErrorList(); }, methods: { + // 鑾峰彇涓嶅彈淇濇姢鐨勫浘鐗� + getPublicImage(md5, width, height) { + if (!md5) return; + if (md5.includes("http")) { + if (width) { + return md5 + `?width=${width}`; + } else { + return md5; + } + } + let src = null; + if (md5) { + src = process.env.VUE_APP_API_URL + `/file/GetPreViewImage?md5=${md5}`; + } + if (width) src += `&width=${width}`; + if (height) src += `&height=${height}`; + return src; + }, // 鏁扮粍杞负瀛楃涓叉柟娉� arrayToString(data) { // 妫�鏌ユ槸鍚︿负鏁扮粍 @@ -610,7 +686,18 @@ const item = this.cardData[index]; for (let cindex = 0; cindex < item.infoList.length; cindex++) { const citem = item.infoList[cindex]; - citem.userAnswer = ""; + if (typeof citem.userAnswer == "string") { + citem.userAnswer = ""; + } else { + if (citem.questionType == "multipleChoice") { + citem.userAnswer = []; + } else { + // 濉┖棰� + for (let dindex = 0; dindex < citem.userAnswer.length; dindex++) { + citem.userAnswer[dindex] = ""; + } + } + } citem.isComplete = false; } } @@ -654,14 +741,17 @@ } } else if ( citem.questionType == "singleChoice" || - citem.questionType == "judge" + citem.questionType == "judge" || + citem.questionType == "dropdown" ) { - if (citem.id == "63825") console.log("i", item); citem.isRight = citem.answer == citem.userAnswer; } else if (citem.questionType == "shortAnswer") { // 绠�绛� 缈昏瘧 citem.isRight = null; - } else if (citem.questionType == "completion") { + } else if ( + citem.questionType == "completion" || + citem.questionType == "mathField" + ) { // 濉┖ if (typeof citem.answer == "string") { citem.isRight = citem.answer == citem.userAnswer[0]; @@ -686,7 +776,7 @@ ).errorList; for (let index = 0; index < errorId.length; index++) { const item = errorId[index]; - if (oldErrodId.indexOf(item == -1)) { + if (oldErrodId.indexOf(item) == -1) { oldErrodId.push(item); } } @@ -768,8 +858,14 @@ }, // 棰樼洰鏀惰棌鎸夐挳,鏀惰棌鍜屽彇娑堝悓涓�鎺ュ彛锛屽彇娑堟暟缁勫噺鍘昏椤筰d setCollect(num, number) { - const item = this.cardData[num].infoList[number]; + let item = null; + if (number) { + item = this.cardData[num].infoList[number]; + } else { + item = this.cardData[num]; + } item.isCollect = !item.isCollect; + console.log(111, item); if (this.cardData.length == 0) { this.collectList.push(item.id); } else { @@ -787,7 +883,7 @@ const item = this.allCollect[index]; if (item.type == this.sourceType) item.collectList = this.collectList; } - // console.log(this.allCollect, this.collectList, list); + console.log("鐐瑰嚮鏀惰棌鎸夐挳", this.allCollect); this.MG.identity .setUserKey({ setKeyRequests: [ @@ -814,6 +910,7 @@ .then((res) => { try { const collect = JSON.parse(res[0].value); + console.log("鍏ㄩ儴鏀惰棌id", collect); if (collect.length) { this.collectList = collect.find( (citem) => citem.type == this.sourceType @@ -860,62 +957,90 @@ }) .catch(() => {}); }, + onChangeInput(e, index, cindex, num) { + this.cardData[index].infoList[cindex].userAnswer[num] = e.target.value; + }, }, }; </script> +<style lang="less"> +.titleText img { + max-width: 80%; + min-width: 220px; +} +</style> + <style lang="less" scoped> -.catalogName { +.catalogName { + display: flex; text-indent: 1em !important; font-size: 16px; + .catalogName-box { + display: inline-block; + width: 94%; + } +} +.catalogImage { + width: 50%; } .examination { min-height: 100px; ul { list-style: none; } + p { margin: 0; } + math { + } } + .examinations-btn-box { height: 30px; width: 78px; padding: 4px 10px; } + .border-box { padding-top: 20px; // border: 2px solid #e9e9e9; } + .ti-2 { text-indent: 2em !important; } + .questionContent { - // display: flex; - // justify-content: center; text-indent: 0em !important; margin-left: 20px; + /deep/ .el-textarea__inner:focus { border-color: #15c0f2; } } + .input { /deep/ .el-input__inner { height: 26px; } } + p { margin-top: 0em; text-indent: 0em !important; line-height: 1.5em; font-size: 16px; } + .colorBox { margin: 0 10px 0 23px; width: 4px; height: 19px; background-color: #ff6c00; } + .textOverFlow { overflow: hidden; text-overflow: ellipsis; @@ -927,51 +1052,63 @@ height: 775px; padding-bottom: 20px; } + .question::-webkit-scrollbar { width: 3px; } + /*婊氬姩鏉℃粦鍧�*/ .question::-webkit-scrollbar-thumb { border-radius: 20px; -webkit-box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2); background-color: #333; } + /*婊氬姩鏉¤建閬�*/ .question::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0); border-radius: 20px; background: #d9d9d9; } + .paperMargin { margin-top: 30px; + ul li { padding: 20px 41px 0px 46px; } + li:last-child { padding-bottom: 20px; } } + .paperQuestion { padding-left: 12px; display: flex; align-items: center; font-size: 16px; + .questionText { font-size: 16px; color: #000; } + span { color: #c2c2c2; } } + /** 棰樺共 */ .questionTitle { display: flex; justify-content: center; + .titleContent { width: 95%; display: flex; align-items: flex-start; + .questionNum { text-indent: 0 !important; margin-right: 5px; @@ -982,51 +1119,76 @@ color: #333; font-weight: bold; } + .text-fl { + display: flex; + align-items: center; + flex-wrap: wrap; + } .titleText { + display: flex; + flex-wrap: wrap; + align-items: center; text-align: left; - // padding: 0 10px 10px 0px; min-width: 90%; font-size: 16px; line-height: 32px; color: #000; + .input-txt { + display: flex; + flex-wrap: wrap; + align-items: center; + } span { display: inline-block; font-size: 16px; - // line-height: 26px; color: #000; font-weight: 400; margin-top: 6px; + } + select { + outline: none; + min-width: 100px; } input { width: 140px; height: 24px; border: 0; outline: none; - border-bottom: 1px solid #15c0f2; + border-bottom: 1px solid #000; } + /deep/ .el-textarea.is-disabled .el-textarea__inner { background-color: #fff; } + /deep/ .el-input.is-disabled .el-input__inner { background-color: #fff; } + /dee/ p { display: flex; align-items: center; } } + ::v-deep { .el-input__wrapper { border-top: 0 !important; } } } + .collect { cursor: pointer; width: 21px; height: 21px; } + .mathField { + min-width: 200px; + max-width: 518px; + } } + /** 閫夐」 */ .option { .el-radio, @@ -1040,13 +1202,16 @@ margin-bottom: 6px; white-space: pre-wrap !important; color: #000; + /deep/ .el-checkbox__label { line-height: 1.5; } } + /deep/ .el-radio__inner { border-color: #a5a3a3; } + .optionContent { margin: 0; display: flex; @@ -1055,14 +1220,17 @@ color: #000; } } + .analysis { margin: 20px 0; width: 94%; // margin-left: 12px; } + .el-collapse { width: 100%; } + /** 瑙f瀽 */ .objective { /deep/ .el-collapse-item__header { @@ -1071,6 +1239,7 @@ padding: 0 20px; font-size: 16px; background-color: #f4f4f4; + .headerBox { width: 100%; height: 100%; @@ -1078,28 +1247,34 @@ justify-content: space-between; align-items: center; flex-wrap: wrap; + .headerConent { height: 100%; display: flex; align-items: center; flex-wrap: wrap; + p { margin-bottom: 0; } + .el-image { width: 9px; height: 9px; } + .correct { color: #1fbc1f; width: 180px; text-align: left; display: flex; + span:nth-child(1) { display: inline-block; width: 82px; } } + .correctBox { width: 100px; height: min-content; @@ -1107,23 +1282,28 @@ text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; - -webkit-line-clamp: 1; /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ + -webkit-line-clamp: 1; + /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ overflow: hidden; } + .error { display: flex; text-align: left; width: 170px; color: #ee1818; + span { height: min-content; } + .errorBox { width: 100px; // height: 48px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; + ::v-deep { img { max-height: 48px; @@ -1142,9 +1322,11 @@ } } } + /deep/ .el-collapse-item__header:focus:not(:hover) { color: #333; } + /deep/ .el-collapse-item__content { width: 93%; padding: 0 20px; @@ -1152,16 +1334,20 @@ font-size: 16px; color: #333; } + /deep/ .el-collapse-item__arrow { display: none; } + .subjectiveItem { background-color: #f4f4f4; padding: 10px 20px; + p { text-indent: 0em; } } + .subjective { /deep/ .el-collapse-item__header { height: 80px; @@ -1173,16 +1359,19 @@ flex-direction: column; justify-content: flex-start; } + .subjectiveTitle { width: 80px; height: 20px; line-height: 20px; } + .subjectiveRefer { display: flex; align-items: flex-start; text-align: left; } + .subjectiveAnswer { width: 540px; height: 20px; @@ -1191,31 +1380,39 @@ text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; - -webkit-line-clamp: 1; /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ + -webkit-line-clamp: 1; + /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ overflow: hidden; line-height: 20px; } + .analysisDetailBox { overflow: hidden; max-height: 100px; transition: 1s; + &.open { max-height: 500px; } + &.close { max-height: 20px; } + .referBox { display: flex; margin-bottom: 10px; + span { width: 80px; color: #999; } + p { flex: 1; overflow: hidden; } + span, p { text-indent: 0em; @@ -1225,28 +1422,34 @@ } } } + // 閫夐」 .optionImg { height: min-content; margin-bottom: 6px; + /deep/ img { margin-left: 10px; object-fit: contain; vertical-align: middle; } } + .optionTxt { height: 32px; } + // 棰樺共浠呭浘鐗� .stemImg { margin: 0 10px 10px 10px; } + // 鏂囧瓧鍔犲浘鐗� .stemTxtAndImage { display: flex; align-items: flex-start; } + .titleTextArea { ::v-deep { img, @@ -1257,19 +1460,23 @@ } } } + .questionAnalysis { width: 100%; height: 48px; display: flex; justify-content: space-between; + .analysisAnswer { width: 74%; display: flex; } + .referAnswer { display: inline-block; width: 60px; } + .answerContent { height: 48px; width: 80%; @@ -1278,64 +1485,80 @@ text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; - -webkit-line-clamp: 1; /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ + -webkit-line-clamp: 1; + /* 杩欓噷鏄秴鍑哄嚑琛岀渷鐣� */ overflow: hidden; } + .el-image { width: 9px; height: 9px; } } + .analysisColor { cursor: pointer; color: #949494; margin-right: 4px; } + .difficulty { display: flex; align-items: center; } + .cartoon { animation: spread 1s linear forwards; } + .downCartoon { animation: downSpred 1s linear forwards; } + .showText { animation: showText 1s linear forwards; } + .hideText { animation: hideText 2s linear forwards; } + @keyframes spread { from { max-height: 20px; } + to { max-height: 500px; + p { flex: 1; overflow: hidden; } } } + @keyframes downSpred { from { max-height: 500px; } + to { max-height: 20px; } } + @keyframes showText { 100% { height: auto; } } + @keyframes hideText { 0% { height: auto; } + 100% { height: 20px; overflow: hidden; @@ -1343,15 +1566,18 @@ white-space: nowrap; } } + .yincang { animation: yincang 1s linear forwards; } + @keyframes yincang { from { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } + to { overflow: auto; text-overflow: initial; @@ -1364,19 +1590,23 @@ display: flex; justify-content: center; flex-wrap: wrap; + .el-button { margin-top: 10px; } } + .radio-img { width: 200px; object-fit: contain; } + .collect-png { cursor: pointer; width: 18px; object-fit: contain; } + /deep/ .examination-math { display: flex; align-items: center; -- Gitblit v1.9.1