Browse Source

Merge branch 'develop' of http://52.130.252.100:10000/TEAMMODEL/TEAMModelOS into develop

CrazyIter_Bin 1 year ago
parent
commit
ca8bb570d7

+ 6 - 6
TEAMModelContest/contest.client/src/locale/lang/en-US.js

@@ -126,13 +126,13 @@ const enUS = {
         save: "Save",
     },
     placeholderlist: {
-        searchActName: "搜索活动名称",
-        searchTeam: "搜索团队信息",
-        input: "请输入",
+        searchActName: "Search activity name",
+        searchTeam: "Search team information",
+        input: "Please input",
         select: "Please select",
-        teamIdentity: "请选择您在团队赛中的身份",
-        choiceYear: "选择年份",
-        scoring: "请打分",
+        teamIdentity: "Please select your role in the team",
+        choiceYear: "Select year",
+        scoring: "Please rate",
     },
     elMessage: {
         logout: "已退出登录",

+ 6 - 6
TEAMModelContest/contest.client/src/locale/lang/zh-TW.js

@@ -126,13 +126,13 @@ const zhTW = {
         save: "儲存",
     },
     placeholderlist: {
-        searchActName: "搜索活动名称",
-        searchTeam: "搜索团队信息",
-        input: "请输入",
+        searchActName: "搜尋活動名稱",
+        searchTeam: "搜尋團隊資訊",
+        input: "請輸入",
         select: "請選擇",
-        teamIdentity: "请选择您在团队赛中的身份",
-        choiceYear: "选择年份",
-        scoring: "请打分",
+        teamIdentity: "請選擇您在團隊賽中的身分",
+        choiceYear: "選擇年份",
+        scoring: "請打分數",
     },
     elMessage: {
         logout: "已退出登录",

+ 5 - 0
TEAMModelOS/ClientApp/public/lang/en-US.js

@@ -1694,6 +1694,7 @@ const LANG_EN_US = {
             openAll: 'Unfold All',
             collapseAll: 'Fold All',
             autoCreate: 'SMART Design',
+            emptyPaper: 'New Exam Paper',
             manualCreate: 'Manual Design',
             importCreate: 'Import Design',
             moreAction: 'More',
@@ -4706,6 +4707,8 @@ const LANG_EN_US = {
             listName: 'List Name',
             joinTime: 'Application Time',
             todayWrong: "Today's SMART Incorrectly Answered Question Practice",
+            top: 'Pin',
+            excelTop: 'Unpin',
         },
         public: {
             noData: 'No data yet',
@@ -5253,6 +5256,8 @@ const LANG_EN_US = {
                 rightSub: "Correct",
                 shwoPage: "Answer Card",
                 reAns: "Re-answer",
+                entireExam: 'Answer the whole paper',
+                singleQues: 'Answer a single question',
             },
             report: {
                 title: 'Report',

+ 5 - 0
TEAMModelOS/ClientApp/public/lang/zh-CN.js

@@ -1693,6 +1693,7 @@ const LANG_ZH_CN = {
             openAll: '全部展开',
             collapseAll: '全部折叠',
             autoCreate: '智能组卷',
+            emptyPaper:'新建空白卷',
             manualCreate: '挑题组卷',
             importCreate: '文档导入',
             moreAction: '更多操作',
@@ -4704,6 +4705,8 @@ const LANG_ZH_CN = {
             listName: '名单名称',
             joinTime: '申请时间',
             todayWrong: '今日可进行错题练习',
+            top: '置顶',
+            excelTop: '取消置顶',
         },
         public: {
             noData: '暂无数据',
@@ -5251,6 +5254,8 @@ const LANG_ZH_CN = {
                 rightSub: "正确题目",
                 showPage: "答题卡",
                 reAns: "重新作答",
+                entireExam: '整卷作答',
+                singleQues: '单题作答',
             },
             report: {
                 title: '报告',

+ 5 - 0
TEAMModelOS/ClientApp/public/lang/zh-TW.js

@@ -1696,6 +1696,7 @@ const LANG_ZH_TW = {
             openAll: '全部展開',
             collapseAll: '全部折疊',
             autoCreate: '智慧組卷',
+            emptyPaper: '新建空白卷',
             manualCreate: '挑題組卷',
             importCreate: '導題組卷',
             moreAction: '更多操作',
@@ -4707,6 +4708,8 @@ const LANG_ZH_TW = {
             listName: '名單名稱',
             joinTime: '申請時間',
             todayWrong: '今日可進行的智慧錯題練習',
+            top: '置頂',
+            excelTop: '取消置頂',
         },
         public: {
             noData: '暫無資料',
@@ -5254,6 +5257,8 @@ const LANG_ZH_TW = {
                 rightSub: "正確題目",
                 shwoPage: "答題卡",
                 reAns: "重新作答",
+                entireExam: '整卷作答',
+                singleQues: '單題作答',
             },
             report: {
                 title: '報告',

+ 7 - 3
TEAMModelOS/ClientApp/src/common/BaseCanvas.vue

@@ -66,7 +66,7 @@
                     </div>
                     <ColorPicker v-model="color" />
                 </div>
-                <canvas id="canvas" :width="width" :height="height"></canvas>
+                <canvas :id="canvasId" :width="width" :height="height"></canvas>
             </div>
             <div class="footer">
                 <Button @click="cancel">{{ vm.$t("utils.cancel") }}</Button>
@@ -96,6 +96,10 @@
 				type:Object,
 				default:() => {}
 			},
+			canvasId:{
+				type:String,
+				default:'canvas'
+			}
 		},
 		data() {
 			return {
@@ -222,7 +226,7 @@
 				this.canvas.discardActiveObject();
 				this.canvas.requestRenderAll();
 				setTimeout(() => {
-					var canvas = document.getElementById('canvas')
+					var canvas = document.getElementById(this.canvasId)
 					var imgData = canvas.toDataURL('png')
 					this.$emit('getImg',imgData)
 					this.$emit('onSaveCanvas', {
@@ -710,7 +714,7 @@
 			})
 			
 			this.$nextTick(() => {
-				this.canvas = new fabric.Canvas("canvas");
+				this.canvas = new fabric.Canvas(this.canvasId);
 				this.canvas.selectionColor = "rgba(0,0,0,0.1)";
 				this.canvas.on("mouse:down", this.mousedown);
 				this.canvas.on("mouse:move", this.mousemove);

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperTest.less

@@ -968,7 +968,7 @@
 
     .que-item {
         width: 100%;
-        max-height: 200px;
+        // max-height: 200px;
         overflow-y: scroll;
     }
 }

+ 187 - 185
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperViewBox/PaperTest.vue

@@ -368,216 +368,218 @@
             <!-- 单题展示 -->
             <div v-if="!instantPaper && !entireExam" class="question-content">
                 <div v-if="!showExam.length" style="text-align: center; margin-top: 25%; font-size: 20px;">{{ $t("studentWeb.exam.testpop.noExam") }}</div>
-                <div :class="['questionContent', {'qamode-box': instantPaper}]" ref="questionBox" v-else>
-                    <!-- <span class="hintwrap">
-                        <Tooltip :content="$t('studentWeb.exam.report.noSource')" theme="light" placement="left">
-                            <span class="hintIcon">
-                                <svg-icon icon-class="hint" />
-                            </span>
-                        </Tooltip>
-                    </span> -->
-                    <div class="questioDes">
-                        <div class="questionType" v-if="getQue(queNo).parent === undefined">
-                            <span>{{getTestType(getQue(queNo).type)}}</span>
-                            <span v-if="getQue(queNo).type === 'subjective' && showExam[queNo].answerType">-{{ $t(`evaluation.newExercise.answerType.${showExam[queNo].answerType}`) }}</span>
-                        </div>
-                        <div class="que-item" v-if="getQue(queNo).type != 'compose' && getQue(queNo).parent === undefined">
-                            <span v-if="isWrong" @click="changeStar(!getQue(queNo).star, queNo)" style="margin-right: 10px; cursor: pointer;">
-                                <Icon custom="iconfont icon-shoucang1" size="25" v-show="!getQue(queNo).star" />
-                                <Icon custom="iconfont icon-shoucang2" size="25" color="#FF7A4E" v-show="getQue(queNo).star" />
-                            </span>
-                            <span>{{ queNo + 1 }}.</span>
-                            <!--题目渲染-->
-                            <div id="answer-box" v-html="getQue(queNo).question"></div>
-                        </div>
-                        <!--综合题-->
-                        <div v-if="getQue(queNo).type === 'compose' || getQue(queNo).parent !== undefined">
-                            <div class="compose-content" v-if="getQue(queNo).parent !== undefined">
-                                <div class="questionType">
-                                    <span>{{getTestType(getQue(queNo).parentInfo.type)}}</span>
-                                    <span v-if="getQue(queNo).type === 'subjective' && showExam[queNo].answerType">({{ $t(`evaluation.newExercise.answerType.${showExam[queNo].answerType}`) }})</span>
-                                </div>
-                                <div class="compose-box">
-                                    <span v-if="isWrong" @click="changeStar(!getQue(queNo).star, queNo, true)" style="cursor: pointer;">
-                                        <Icon custom="iconfont icon-shoucang1" size="25" v-show="!getQue(queNo).star" />
-                                        <Icon custom="iconfont icon-shoucang2" size="25" color="#FF7A4E" v-show="getQue(queNo).star" />
-                                    </span>
-                                    <span style="margin-left:10px;font-weight:800;font-size:15px">{{$t("studentWeb.exam.testpop.queNo")}}</span>
-                                    <br />
-                                    <div class="compose-item">
-                                        <!--<span w>{{ getQue(queNo).parent + 1}}.</span>-->
-                                        <!--题干渲染-->
-                                        <div v-html="getQue(queNo).parentInfo.question"></div>
-                                    </div>
-                                </div>
-                                <div class="que-content">
-                                    <span style="width:51px">{{ getQue(queNo).paperIndex}}:</span>
-                                    <!--题目渲染-->
-                                    <div class="que-items" id="answer-box" v-html="getQue(queNo).question"></div>
-                                </div>
+                <div :class="['questionContent', {'qamode-box': instantPaper}]" ref="questionBox" style="height: 100%;" v-else>
+                    <vuescroll>
+                        <!-- <span class="hintwrap">
+                            <Tooltip :content="$t('studentWeb.exam.report.noSource')" theme="light" placement="left">
+                                <span class="hintIcon">
+                                    <svg-icon icon-class="hint" />
+                                </span>
+                            </Tooltip>
+                        </span> -->
+                        <div class="questioDes">
+                            <div class="questionType" v-if="getQue(queNo).parent === undefined">
+                                <span>{{getTestType(getQue(queNo).type)}}</span>
+                                <span v-if="getQue(queNo).type === 'subjective' && showExam[queNo].answerType">-{{ $t(`evaluation.newExercise.answerType.${showExam[queNo].answerType}`) }}</span>
                             </div>
-                        </div>
-                    </div>
-                    <div class="answers">
-                        <div class="questionNo">{{$t("studentWeb.exam.testpop.myAns")}}</div>
-                        <div class="answers-box">
-                            <!--判断题选项-->
-                            <div v-if="getQue(queNo).type == 'judge'" align="center">
-                                <!-- <div class="testButn">
-                                    <Radio-group v-model="checkers[queNo][0]">
-                                        <Radio label="A"><Icon type="md-checkmark" /></Radio>
-                                        <Radio label="B"><Icon type="md-close" /></Radio>
-                                    </Radio-group>
-                                </div> -->
-                                <label class="testBtn yesNoBtn">
-                                    <input type="radio" value="A" v-model="checkers[queNo][0]" :disabled="!closeTest" />
-                                    <div class="testbg" :style="{'background-color': isWrong && showEnd && checkers[queNo][0] === 'A' ? (getQue(queNo).answer[0] === 'A' ? '' : 'red !important') : ''}">
-                                        <!-- <Icon type="ios-radio-button-off" /> -->
-                                        <Icon type="md-checkmark" />
-                                    </div>
-                                </label>
-                                <label class="testBtn yesNoBtn">
-                                    <input type="radio" value="B" v-model="checkers[queNo][0]" :disabled="!closeTest" />
-                                    <div class="testbg" :style="{'background-color': isWrong && showEnd && checkers[queNo][0] === 'B' ? (getQue(queNo).answer[0] === 'B' ? '' : 'red !important') : ''}">
-                                        <Icon type="md-close" />
-                                    </div>
-                                </label>
+                            <div class="que-item" v-if="getQue(queNo).type != 'compose' && getQue(queNo).parent === undefined">
+                                <span v-if="isWrong" @click="changeStar(!getQue(queNo).star, queNo)" style="margin-right: 10px; cursor: pointer;">
+                                    <Icon custom="iconfont icon-shoucang1" size="25" v-show="!getQue(queNo).star" />
+                                    <Icon custom="iconfont icon-shoucang2" size="25" color="#FF7A4E" v-show="getQue(queNo).star" />
+                                </span>
+                                <span>{{ queNo + 1 }}.</span>
+                                <!--题目渲染-->
+                                <div id="answer-box" v-html="getQue(queNo).question"></div>
                             </div>
-                            <!--选择题选项-->
-                            <div class="select-box" v-else-if="getQue(queNo).type === 'single' || getQue(queNo).type === 'multiple'">
-                                <label class="testBtn"
-                                    v-for="(item, index) in getQue(queNo).option"
-                                    :key="index">
-                                    <span v-show="showEnd">
-                                        <Icon type="md-checkmark-circle" color="#24B880" size="20"
-                                            v-if="getQue(queNo).answer.includes(item.code)"
-                                        />
-                                        <Icon type="md-close-circle" color="red" size="20"
-                                            v-if="checkers[queNo].includes(item.code) && !getQue(queNo).answer.includes(item.code)"
-                                        />
-                                    </span>
-                                    <input type="checkbox"
-                                        :value="getQue(queNo).option[index].code"
-                                        v-model="checkers[queNo]"
-                                        @click="getAns(queNo,index)"
-                                        :disabled="!closeTest" />
-                                    <div class="testbg">
-                                        <div style="display:flex">
-                                            <span>{{ getQue(queNo).option[index].code }}. </span>
-                                            <div v-html="item.value" @click.stop.native.prevent="showImg($event)"></div>
+                            <!--综合题-->
+                            <div v-if="getQue(queNo).type === 'compose' || getQue(queNo).parent !== undefined">
+                                <div class="compose-content" v-if="getQue(queNo).parent !== undefined">
+                                    <div class="questionType">
+                                        <span>{{getTestType(getQue(queNo).parentInfo.type)}}</span>
+                                        <span v-if="getQue(queNo).type === 'subjective' && showExam[queNo].answerType">({{ $t(`evaluation.newExercise.answerType.${showExam[queNo].answerType}`) }})</span>
+                                    </div>
+                                    <div class="compose-box">
+                                        <span v-if="isWrong" @click="changeStar(!getQue(queNo).star, queNo, true)" style="cursor: pointer;">
+                                            <Icon custom="iconfont icon-shoucang1" size="25" v-show="!getQue(queNo).star" />
+                                            <Icon custom="iconfont icon-shoucang2" size="25" color="#FF7A4E" v-show="getQue(queNo).star" />
+                                        </span>
+                                        <span style="margin-left:10px;font-weight:800;font-size:15px">{{$t("studentWeb.exam.testpop.queNo")}}</span>
+                                        <br />
+                                        <div class="compose-item">
+                                            <!--<span w>{{ getQue(queNo).parent + 1}}.</span>-->
+                                            <!--题干渲染-->
+                                            <div v-html="getQue(queNo).parentInfo.question"></div>
                                         </div>
-                                        <div style="clear:both"></div>
                                     </div>
-                                </label>
+                                    <div class="que-content">
+                                        <span style="width:51px">{{ getQue(queNo).paperIndex}}:</span>
+                                        <!--题目渲染-->
+                                        <div class="que-items" id="answer-box" v-html="getQue(queNo).question"></div>
+                                    </div>
+                                </div>
                             </div>
-                            <!--问答题-->
-                            <div class="compose-content" v-else-if="getQue(queNo).type === 'subjective'">
-                                <!-- showExam[queNo].answerType: text(文本) Image(图片) file(文件) audio(音频 useAutoScore(自动评分) answerLang(语言)) -->
-                                <!-- <template v-if="showExam[queNo].answerType === 'text' || showExam[queNo].answerType === 'text_Image'"> -->
-                                <Input v-if="showExam[queNo].answerType === 'text'" v-model="checkers[queNo][0]" type="textarea" :rows="5" :autosize="{minRows: 5,maxRows: 10}" :placeholder="$t('studentWeb.exam.inputAnswers')"></Input>
-                                <Compose v-else-if="showExam[queNo].answerType === 'text_Image'" ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
-                                <!-- </template> -->
-                                <template v-else-if="showExam[queNo].answerType === 'audio'">
-                                    <AudioRecorder :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns" />
-                                </template>
-                                <template v-else-if="showExam[queNo].answerType === 'file' || showExam[queNo].answerType === 'image'">
-                                    <Upload type="drag" :accept="subjectiveAccept(showExam[queNo])" action="" :before-upload="file => customUpload(file, queNo)">
-                                        <div style="padding: 20px 0" ref="upload1">
-                                            <Icon type="ios-cloud-upload" size="52" :style="{color: checkers[queNo].length ? '#b4b4b4' : '#2d8cf0' }"></Icon>
-                                            <p>
-                                                <span>
-                                                    {{ checkers[queNo].length ? $t('jyzx.offline.againLoad') : $t('studentWeb.art.relatedFile')}}
-                                                </span>
-                                            </p>
+                        </div>
+                        <div class="answers">
+                            <div class="questionNo">{{$t("studentWeb.exam.testpop.myAns")}}</div>
+                            <div class="answers-box">
+                                <!--判断题选项-->
+                                <div v-if="getQue(queNo).type == 'judge'" align="center">
+                                    <!-- <div class="testButn">
+                                        <Radio-group v-model="checkers[queNo][0]">
+                                            <Radio label="A"><Icon type="md-checkmark" /></Radio>
+                                            <Radio label="B"><Icon type="md-close" /></Radio>
+                                        </Radio-group>
+                                    </div> -->
+                                    <label class="testBtn yesNoBtn">
+                                        <input type="radio" value="A" v-model="checkers[queNo][0]" :disabled="!closeTest" />
+                                        <div class="testbg" :style="{'background-color': isWrong && showEnd && checkers[queNo][0] === 'A' ? (getQue(queNo).answer[0] === 'A' ? '' : 'red !important') : ''}">
+                                            <!-- <Icon type="ios-radio-button-off" /> -->
+                                            <Icon type="md-checkmark" />
                                         </div>
-                                    </Upload>
-                                    <div class="repair-link-wrap-item-box" v-if="checkers[queNo].length">
-                                        <div class="file-icon">
-                                            <img :src="$tools.getFileThum(getFileType(checkers[queNo][0]), getFileName(checkers[queNo][0]))"/>
+                                    </label>
+                                    <label class="testBtn yesNoBtn">
+                                        <input type="radio" value="B" v-model="checkers[queNo][0]" :disabled="!closeTest" />
+                                        <div class="testbg" :style="{'background-color': isWrong && showEnd && checkers[queNo][0] === 'B' ? (getQue(queNo).answer[0] === 'B' ? '' : 'red !important') : ''}">
+                                            <Icon type="md-close" />
                                         </div>
-                                        <div class="file-info">
-                                            <p class="file-name">{{ getFileName(checkers[queNo][0]) }}</p>
-                                            <div>
-                                                <span @click="onPreview(checkers[queNo][0], true)">{{ $t('ability.review.preview')}}</span>
-                                                <span @click="onDownload(checkers[queNo][0], true)">{{ $t('ability.review.download')}}</span>
+                                    </label>
+                                </div>
+                                <!--选择题选项-->
+                                <div class="select-box" v-else-if="getQue(queNo).type === 'single' || getQue(queNo).type === 'multiple'">
+                                    <label class="testBtn"
+                                        v-for="(item, index) in getQue(queNo).option"
+                                        :key="index">
+                                        <span v-show="showEnd">
+                                            <Icon type="md-checkmark-circle" color="#24B880" size="20"
+                                                v-if="getQue(queNo).answer.includes(item.code)"
+                                            />
+                                            <Icon type="md-close-circle" color="red" size="20"
+                                                v-if="checkers[queNo].includes(item.code) && !getQue(queNo).answer.includes(item.code)"
+                                            />
+                                        </span>
+                                        <input type="checkbox"
+                                            :value="getQue(queNo).option[index].code"
+                                            v-model="checkers[queNo]"
+                                            @click="getAns(queNo,index)"
+                                            :disabled="!closeTest" />
+                                        <div class="testbg">
+                                            <div style="display:flex">
+                                                <span>{{ getQue(queNo).option[index].code }}. </span>
+                                                <div v-html="item.value" @click.stop.native.prevent="showImg($event)"></div>
+                                            </div>
+                                            <div style="clear:both"></div>
+                                        </div>
+                                    </label>
+                                </div>
+                                <!--问答题-->
+                                <div class="compose-content" v-else-if="getQue(queNo).type === 'subjective'">
+                                    <!-- showExam[queNo].answerType: text(文本) Image(图片) file(文件) audio(音频 useAutoScore(自动评分) answerLang(语言)) -->
+                                    <!-- <template v-if="showExam[queNo].answerType === 'text' || showExam[queNo].answerType === 'text_Image'"> -->
+                                    <Input v-if="showExam[queNo].answerType === 'text'" v-model="checkers[queNo][0]" type="textarea" :rows="5" :autosize="{minRows: 5,maxRows: 10}" :placeholder="$t('studentWeb.exam.inputAnswers')"></Input>
+                                    <Compose v-else-if="showExam[queNo].answerType === 'text_Image'" ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
+                                    <!-- </template> -->
+                                    <template v-else-if="showExam[queNo].answerType === 'audio'">
+                                        <AudioRecorder :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns" />
+                                    </template>
+                                    <template v-else-if="showExam[queNo].answerType === 'file' || showExam[queNo].answerType === 'image'">
+                                        <Upload type="drag" :accept="subjectiveAccept(showExam[queNo])" action="" :before-upload="file => customUpload(file, queNo)">
+                                            <div style="padding: 20px 0" ref="upload1">
+                                                <Icon type="ios-cloud-upload" size="52" :style="{color: checkers[queNo].length ? '#b4b4b4' : '#2d8cf0' }"></Icon>
+                                                <p>
+                                                    <span>
+                                                        {{ checkers[queNo].length ? $t('jyzx.offline.againLoad') : $t('studentWeb.art.relatedFile')}}
+                                                    </span>
+                                                </p>
+                                            </div>
+                                        </Upload>
+                                        <div class="repair-link-wrap-item-box" v-if="checkers[queNo].length">
+                                            <div class="file-icon">
+                                                <img :src="$tools.getFileThum(getFileType(checkers[queNo][0]), getFileName(checkers[queNo][0]))"/>
+                                            </div>
+                                            <div class="file-info">
+                                                <p class="file-name">{{ getFileName(checkers[queNo][0]) }}</p>
+                                                <div>
+                                                    <span @click="onPreview(checkers[queNo][0], true)">{{ $t('ability.review.preview')}}</span>
+                                                    <span @click="onDownload(checkers[queNo][0], true)">{{ $t('ability.review.download')}}</span>
+                                                </div>
                                             </div>
                                         </div>
+                                    </template>
+                                    <div class="compose-content" v-else>
+                                        <Compose ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
                                     </div>
-                                </template>
+                                </div>
                                 <div class="compose-content" v-else>
                                     <Compose ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
                                 </div>
                             </div>
-                            <div class="compose-content" v-else>
-                                <Compose ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
-                            </div>
-                        </div>
-                    </div>
-                    <!-- <div :style="isCheckAns ? 'height: 250px' : ''"></div> -->
-                    <!-- 答案解析 -->
-                    <div v-if="isWrong" :class="['analysis', showEnd ? 'active' : '']" @click="changeAnalysisType(true)">
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.ansRes") }}】</span>
-                            <div class="item-explain-details">
-                                <span v-if="!checkers[queNo].length">{{ $t('studentWeb.exam.report.noAns') }}</span>
-                                <span v-else v-for="(item, index) in checkers[queNo]" :key="index" v-html="item"></span>
-                            </div>
                         </div>
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.testAns") }}】</span>
-                            <div class="item-explain-details">
-                                <span v-if="!showExam[queNo].answer.length">{{ $t('studentWeb.exam.report.noAns') }}</span>
-                                <span v-else v-for="(item, index) in showExam[queNo].answer" :key="index" v-html="item"></span>
+                        <!-- <div :style="isCheckAns ? 'height: 250px' : ''"></div> -->
+                        <!-- 答案解析 -->
+                        <div v-if="isWrong" :class="['analysis', showEnd ? 'active' : '']" @click="changeAnalysisType(true)">
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.ansRes") }}】</span>
+                                <div class="item-explain-details">
+                                    <span v-if="!checkers[queNo].length">{{ $t('studentWeb.exam.report.noAns') }}</span>
+                                    <span v-else v-for="(item, index) in checkers[queNo]" :key="index" v-html="item"></span>
+                                </div>
                             </div>
-                        </div>
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.testAnalyse") }}】</span>
-                            <div class="item-explain-details">
-                                <div v-html="showExam[queNo].explain ? showExam[queNo].explain : $t('studentWeb.exam.report.noAnalyse')"></div>
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.testAns") }}】</span>
+                                <div class="item-explain-details">
+                                    <span v-if="!showExam[queNo].answer.length">{{ $t('studentWeb.exam.report.noAns') }}</span>
+                                    <span v-else v-for="(item, index) in showExam[queNo].answer" :key="index" v-html="item"></span>
+                                </div>
                             </div>
-                        </div>
-                        <!-- 知识点 -->
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.knowledge") }}】</span>
-                            <div v-if="showExam[queNo].knowledge && showExam[queNo].knowledge.length" class="item-explain-details">
-                                <span v-for="(knowledge, index) in showExam[queNo].knowledge" :key="index" class="knowledge-style">
-                                    {{ knowledge }}
-                                </span>
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.testAnalyse") }}】</span>
+                                <div class="item-explain-details">
+                                    <div v-html="showExam[queNo].explain ? showExam[queNo].explain : $t('studentWeb.exam.report.noAnalyse')"></div>
+                                </div>
                             </div>
-                            <div v-else class="item-explain-details">
-                                {{ $t("studentWeb.exam.report.noKnowledge") }}
+                            <!-- 知识点 -->
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.knowledge") }}】</span>
+                                <div v-if="showExam[queNo].knowledge && showExam[queNo].knowledge.length" class="item-explain-details">
+                                    <span v-for="(knowledge, index) in showExam[queNo].knowledge" :key="index" class="knowledge-style">
+                                        {{ knowledge }}
+                                    </span>
+                                </div>
+                                <div v-else class="item-explain-details">
+                                    {{ $t("studentWeb.exam.report.noKnowledge") }}
+                                </div>
                             </div>
-                        </div>
-                        <!-- 认知层次 -->
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.filed") }}】</span>
-                            <div class="item-explain-details">
-                                <div>{{ levelList[showExam[queNo].field - 1] }}</div>
+                            <!-- 认知层次 -->
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.filed") }}】</span>
+                                <div class="item-explain-details">
+                                    <div>{{ levelList[showExam[queNo].field - 1] }}</div>
+                                </div>
                             </div>
-                        </div>
-                        <div class="item-explain">
-                            <span class="explain-title">【{{ $t("studentWeb.exam.report.repairSource") }}】</span>
-                            <div class="item-explain-details-repair">
-                                <div v-if="showExam[queNo].repair.length != 0">
-                                    <div v-for="(repairSource, normalIndex) in showExam[queNo].repair" :key="normalIndex" class="repair-link-wrap-item-box">
-                                        <div class="file-icon">
-                                            <img :src="$tools.getFileThum(repairSource.type, repairSource.name)"/>
-                                        </div>
-                                        <div class="file-info">
-                                            <p class="file-name">{{ repairSource.name }}</p>
-                                            <div>
-                                                <span @click.stop="onPreview(repairSource)" v-if="repairSource.type !== 'other'">{{ $t('ability.review.preview')}}</span>
-                                                <span @click.stop="onDownload(repairSource)" v-if="repairSource.type !== 'link'">{{ $t('ability.review.download')}}</span>
+                            <div class="item-explain">
+                                <span class="explain-title">【{{ $t("studentWeb.exam.report.repairSource") }}】</span>
+                                <div class="item-explain-details-repair">
+                                    <div v-if="showExam[queNo].repair.length != 0">
+                                        <div v-for="(repairSource, normalIndex) in showExam[queNo].repair" :key="normalIndex" class="repair-link-wrap-item-box">
+                                            <div class="file-icon">
+                                                <img :src="$tools.getFileThum(repairSource.type, repairSource.name)"/>
+                                            </div>
+                                            <div class="file-info">
+                                                <p class="file-name">{{ repairSource.name }}</p>
+                                                <div>
+                                                    <span @click.stop="onPreview(repairSource)" v-if="repairSource.type !== 'other'">{{ $t('ability.review.preview')}}</span>
+                                                    <span @click.stop="onDownload(repairSource)" v-if="repairSource.type !== 'link'">{{ $t('ability.review.download')}}</span>
+                                                </div>
                                             </div>
                                         </div>
                                     </div>
-                                </div>
-                                <div v-else-if="!showExam[queNo].repair.length">
-                                    {{ $t('studentWeb.exam.report.noSource') }}
+                                    <div v-else-if="!showExam[queNo].repair.length">
+                                        {{ $t('studentWeb.exam.report.noSource') }}
+                                    </div>
                                 </div>
                             </div>
                         </div>
-                    </div>
+                    </vuescroll>
                 </div>
             </div>
             <!-- 答题卡 -->
@@ -591,7 +593,7 @@
                         <span style="font-weight: 800;">{{ $t("studentWeb.exam.testpop.myAnswerSheet") }}</span>
                         <div style="font-size: 14px; margin-right: 10px;">
                             <i-switch v-model="entireExam" size="small" />
-                            <span>{{ entireExam ? '整卷作答' : '单题作答' }}</span>
+                            <span>{{ entireExam ? $t("studentWeb.exam.testpop.entireExam") : $t("studentWeb.exam.testpop.previsingleQuesous") }}</span>
                         </div>
                     </div>
                     <!--切換頁-->

+ 7 - 7
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue

@@ -11,12 +11,12 @@
       <p v-if="answerImg" style="font-weight: bold; margin-bottom: 20px">
         {{ $t("studentWeb.exam.testpop.reAns") }}
       </p>
-      <BaseCanvas :vm="vm" :bgImg="markBg" :isStudent="markStatus" @onCloseModal="closeModal" @onSaveCanvas="saveMark"></BaseCanvas>
+      <BaseCanvas :canvasId="'canvas' + index" :vm="vm" :bgImg="markBg" :isStudent="markStatus" @onCloseModal="closeModal" @onSaveCanvas="saveMark"></BaseCanvas>
     </div>
     <Modal v-model="markStatus" fullscreen :title="$t('studentWeb.exam.answer')" footer-hide ref="compose">
       <BaseCanvas v-if="markStatus" :vm="vm" :bgImg="markBg" :isStudent="markStatus" @onCloseModal="closeModal" @onSaveCanvas="saveMark"></BaseCanvas>
     </Modal>
-    <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
+    <iframe class="frame" :id="'answerIframe' + index" :srcdoc="itemInfo.question"></iframe>
   </div>
 </template>
 <script>
@@ -174,17 +174,17 @@ export default {
     },
     markStuAnswer() {
       let answerIframe = ""
-      answerIframe = document.getElementById("answerIframe")
+      answerIframe = document.getElementById(`answerIframe${this.index}`)
+      console.log(
+        document.getElementById(`answerIframe${this.index}`).contentWindow.document.body
+      )
       // answerIframe.contentWindow.document.body.style.width = "fit-content"
       answerIframe.contentWindow.document.body.style.maxWidth = "1160px"
       answerIframe.contentWindow.document.body.style.maxHeight = "480px"
       answerIframe.contentWindow.document.body.style.backgroundColor =
         "#f5f5f5"
-      console.log(
-        document.getElementById("answerIframe").contentWindow.document
-      )
       let iframe = document
-        .getElementById("answerIframe")
+        .getElementById(`answerIframe${this.index}`)
         .contentWindow.document.getElementsByTagName("p")
 
       if (iframe.length > 0) {

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue

@@ -31,7 +31,7 @@
                         <div style="display: flex; justify-content: space-between;">
                             <p class="class-name" :title="`${item.name} - ${item.groupName}`">{{ item.name }} - {{ item.groupName }}</p>
                             <span @click.stop="toTop(item)" v-show="!item.subjectList">
-                                <Icon custom="iconfont icon-zhiding" size="18" :color="item.top ? '#239720' : '#b5b5b5'" :title="item.top? '取消置顶' : '置顶'"></Icon>
+                                <Icon custom="iconfont icon-zhiding" size="18" :color="item.top ? '#239720' : '#b5b5b5'" :title="item.top? $t('studentWeb.home.excelTop') : $t('studentWeb.home.top')"></Icon>
                             </span>
                         </div>
                         <!-- <p class="paper-item-school">

+ 8 - 1
TEAMModelOS/ClientApp/src/view/classrecord/eventchart/Cowork.vue

@@ -98,7 +98,13 @@ export default {
                             }
                         }
                     }
-                ]
+                ],
+                dataZoom: [{
+                    show: true,
+                    height: 10,
+                    start: 0,
+                    end: 100,
+                }],
             },
             groupChart: undefined,
             groupOption: {
@@ -270,6 +276,7 @@ export default {
                                 selected: !index
                             }
                         })
+                        this.groupOption.series[0].label.show = this.groupOption.series[0].data.length < 6
                         this.groupChart.clear()
                         this.groupChart.setOption(this.groupOption)
                         let that = this

+ 4 - 0
TEAMModelOS/ClientApp/src/view/evaluation/bank/index.vue

@@ -31,6 +31,10 @@
 							<Icon type="md-hand" size="16" />
 							<span>{{ $t("evaluation.index.manualCreate") }}</span>
 						</span>
+						<span @click="goCreatePaper('preview')" class="bank-tools-btn">
+							<Icon type="md-clipboard" size="16" />
+							<span>{{ $t("evaluation.index.emptyPaper") }}</span>
+						</span>
 						<span @click="goXkwPick()" class="bank-tools-btn" v-show="hasXkwAuth && !inGlobalSite && isSchool">
 							<Icon type="ios-send" size="16" />
 							<span>{{ $t("evaluation.xkwMode") }}</span>

+ 1 - 1
TEAMModelOS/ClientApp/src/view/evaluation/index/CreatePaper.vue

@@ -511,7 +511,7 @@ export default {
 
           }
         })
-      } else {
+      }else {
         this.activeTab = data
       }
     },

+ 190 - 188
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseMultiple.vue

@@ -1,40 +1,41 @@
 <template>
 	<div>
 		<div class="exersices-content">
-			<IconText :text="$t('evaluation.multiple') + $t('evaluation.newExercise.stem')" :color="'#2d8cf0'" :icon="'ios-create'" style="margin-bottom:15px;"></IconText>
+			<IconText :text="$t('evaluation.multiple') + $t('evaluation.newExercise.stem')" :color="'#2d8cf0'" :icon="'ios-create'" style="margin-bottom: 15px"></IconText>
 			<div>
-				<div ref="singleEditor" style="text-align:left"></div>
+				<div ref="singleEditor" style="text-align: left"></div>
 			</div>
 		</div>
 		<div class="exersices-option" ref="optionRefs">
 			<IconText :text="$t('evaluation.newExercise.multipleOption')" :color="'#FF871C'" :icon="'md-reorder'"></IconText>
-			<div v-for="(item,index) in options" :key="index" :ref="'optionBox' + index" :class="'editor-wrap-'+item" style="margin-top:10px;display:flex">
-				<span class="fl-center option-delete" @click="deleteOption(index,item)"><Icon type="md-remove-circle" /></span>
+			<div v-for="(item, index) in options" :key="index" :ref="'optionBox' + index" :class="'editor-wrap-' + item" style="margin-top: 10px; display: flex">
+				<span class="fl-center option-delete" @click="deleteOption(index, item)"><Icon type="md-remove-circle" /></span>
 				<span class="fl-center option-order" :ref="'optionOrder' + index" :data-index="index">{{ renderIndex(index) }}</span>
-				<div :ref="'singleOption'+index" style="text-align:left" class="option-editor" @click="optionClick(item)"></div>
-				<span :class="['fl-center', 'option-setting', trueArr.indexOf(index) > -1 ? 'option-true':'']" @click="settingAnswer(index)">{{ trueArr.indexOf(index) > -1  ? $t('evaluation.newExercise.trueAnswer') :$t('evaluation.newExercise.setAnswer') }}</span>
-
+				<div :ref="'singleOption' + index" style="text-align: left" class="option-editor" @click="optionClick(item)"></div>
+				<span :class="['fl-center', 'option-setting', trueArr.indexOf(index) > -1 ? 'option-true' : '']" @click="settingAnswer(index)">{{ trueArr.indexOf(index) > -1 ? $t("evaluation.newExercise.trueAnswer") : $t("evaluation.newExercise.setAnswer") }}</span>
 			</div>
-			<p class="option-add"><span @click="addOption()">+ {{$t('evaluation.newExercise.addOption')}} </span><span style="color:rgb(60,196,82);margin-left:15px;font-weight:bold">{{$t('evaluation.newExercise.trueAnswer')}}:{{ multipleAnswers.join('') }}</span></p>
+			<p class="option-add">
+				<span @click="addOption()">+ {{ $t("evaluation.newExercise.addOption") }} </span><span style="color: rgb(60, 196, 82); margin-left: 15px; font-weight: bold">{{ $t("evaluation.newExercise.trueAnswer") }}:{{ multipleAnswers.join("") }}</span>
+			</p>
 		</div>
 	</div>
 </template>
 <script>
-	import E from 'wangeditor'
-	import IconText from '@/components/evaluation/IconText.vue'
+	import E from "wangeditor";
+	import IconText from "@/components/evaluation/IconText.vue";
 	export default {
 		components: {
 			IconText
 		},
 		props: {
-			editInfo:{
-				type:Object,
-				default:() => {}
-			},
-			isEdit:{
-				type:Boolean,
-				default:false
+			editInfo: {
+				type: Object,
+				default: () => {}
 			},
+			isEdit: {
+				type: Boolean,
+				default: false
+			}
 		},
 		data() {
 			return {
@@ -42,295 +43,296 @@
 				existOptions: [...new Array(4).keys()],
 				initFlag: true,
 				trueIndex: 0,
-				optionTrueIndex:0,
-				trueArr:[0],
-				optionTrueArr:[0],
-				multipleAnswers:['A'],
+				optionTrueIndex: 0,
+				trueArr: [0],
+				optionTrueArr: [0],
+				multipleAnswers: ["A"],
 				editSingleInfo: {},
 				stemEditor: null,
-				stemContent: '',
-				transferArr:[],
+				stemContent: "",
+				transferArr: [],
 				optionsContent: [],
 				optionEditors: [],
 				defaultConfig: {
 					uploadImgShowBase64: true,
 					menus: this.$tools.wangEditorMenu
 				}
-			}
+			};
 		},
 		created() {},
 		methods: {
 			initEditors() {
+				console.error("initEditors", this.options);
 				// Editor默认配置
 				if (this.options.length > 0) {
 					this.options.forEach((item, i) => {
-						let that = this
-						let editor = new E(that.$refs['singleOption' + i][0])
+						let that = this;
+						let editor = new E(that.$refs["singleOption" + i][0]);
 						// 选项编辑器失焦隐藏工具栏
-						editor.config.onblur = function() {
-							let allToolbars = document.getElementsByClassName('option-editor')
+						editor.config.onblur = function () {
+							let allToolbars = document.getElementsByClassName("option-editor");
 							for (let i = 0; i < allToolbars.length; i++) {
 								if (allToolbars[i].children.length) {
-									allToolbars[i].children[0].style.visibility = 'hidden'
+									allToolbars[i].children[0].style.visibility = "hidden";
 								}
 							}
-						}
-						
+						};
+
 						editor.config.uploadImgShowBase64 = true;
-						this.$editorTools.initMyEditor(editor,this,true)
+						this.$editorTools.initMyEditor(editor, this, true);
 
-							// 选项编辑器内容发生变化时
-							editor.config.onchange = (html) => {
-								let key = String.fromCharCode(64 + parseInt(i + 1))
-								let codeArr = this.optionsContent.map(item => item.code)
-								// 如果已经编辑过则 修改选项内容
-								if (codeArr.indexOf(key) !== -1) {
-									this.optionsContent[codeArr.indexOf(key)].value = html
-								} else { // 否则创建新选项
-									let option = {
-										code: key,
-										value: html
-									}
-									this.optionsContent.push(option)
-								}
+						// 选项编辑器内容发生变化时
+						editor.config.onchange = (html) => {
+							let key = String.fromCharCode(64 + parseInt(i + 1));
+							let codeArr = this.optionsContent.map((item) => item.code);
+							// 如果已经编辑过则 修改选项内容
+							if (codeArr.indexOf(key) !== -1) {
+								this.optionsContent[codeArr.indexOf(key)].value = html;
+							} else {
+								// 否则创建新选项
+								let option = {
+									code: key,
+									value: html
+								};
+								this.optionsContent.push(option);
 							}
-						editor.create()
-						this.optionEditors.push(editor)
-						that.$refs["singleOption" + i][0].dataset.editorId = editor.id
+						};
+						editor.create();
+						this.optionEditors.push(editor);
+						that.$refs["singleOption" + i][0].dataset.editorId = editor.id;
 
 						// 如果是编辑状态 则将选项内容回显
 						if (Object.keys(this.editSingleInfo).length > 0) {
-							editor.txt.html(this.editSingleInfo.option[i].value)
+							editor.txt.html(this.editSingleInfo.option[i].value);
 						}
-					})
+					});
 				}
 			},
 
 			/* 添加选项 */
 			addOption() {
-				let that = this
-				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName('option-order'))
+				let that = this;
+				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName("option-order"));
 				let optionsLength = wraps.length;
-				let newIndex = this.options.length ? parseInt(this.options[this.options.length - 1]) + 1 : 0
+				let newIndex = this.options.length ? parseInt(this.options[this.options.length - 1]) + 1 : 0;
 				// let optionsLength = this.options.length
 				if (optionsLength < 10) {
-					this.options.push(newIndex)
-					this.existOptions.push(newIndex)
+					this.options.push(newIndex);
+					this.existOptions.push(newIndex);
 					this.$nextTick(() => {
-						let editor = new E(that.$refs['singleOption' + newIndex][0])
-						this.$editorTools.initMyEditor(editor,this,true)
+						let editor = new E(that.$refs["singleOption" + newIndex][0]);
+						this.$editorTools.initMyEditor(editor, this, true);
 						editor.config.onchange = (html) => {
-							let key = String.fromCharCode(64 + parseInt(newIndex + 1))
-							let codeArr = this.optionsContent.map(item => item.code)
+							let key = String.fromCharCode(64 + parseInt(newIndex + 1));
+							let codeArr = this.optionsContent.map((item) => item.code);
 							// 如果已经编辑过则 修改选项内容
 							if (codeArr.indexOf(key) !== -1) {
-								this.optionsContent[codeArr.indexOf(key)].value = html
-								console.log(this.optionsContent.map(item => item.code))
-								console.log(this.optionsContent.map(item => item.value))
-							} else { // 否则创建新选项
+								this.optionsContent[codeArr.indexOf(key)].value = html;
+								console.log(this.optionsContent.map((item) => item.code));
+								console.log(this.optionsContent.map((item) => item.value));
+							} else {
+								// 否则创建新选项
 								let option = {
 									code: key,
 									value: html
-								}
-								this.optionsContent.push(option)
+								};
+								this.optionsContent.push(option);
 							}
-						}
-						editor.create()
+						};
+						editor.create();
 						this.optionEditors.push(editor);
-						this.$refs["singleOption" + newIndex][0].dataset.editorId = editor.id
-						this.refreshOrder()
-					})
+						this.$refs["singleOption" + newIndex][0].dataset.editorId = editor.id;
+						this.refreshOrder();
+					});
 				} else {
-					this.$Message.warning(this.$t('evaluation.addTip2'))
+					this.$Message.warning(this.$t("evaluation.addTip2"));
 				}
 			},
-			
-			
+
 			/* 设置正确答案 */
 			settingAnswer(index) {
 				this.$nextTick(() => {
-				    if (this.trueArr.indexOf(index) > -1) {
-						if(this.trueArr.length === 1){
-							this.$Message.warning(this.$t('evaluation.addTip3'))
-						}else{
-							this.trueArr.splice(this.trueArr.indexOf(index), 1)
+					if (this.trueArr.indexOf(index) > -1) {
+						if (this.trueArr.length === 1) {
+							this.$Message.warning(this.$t("evaluation.addTip3"));
+						} else {
+							this.trueArr.splice(this.trueArr.indexOf(index), 1);
 						}
-				    } else {
-				        this.trueArr.push(index)
-				        this.trueArr = this.trueArr.sort() // 选项排序
-				    }
-					this.getAnswerOrder(this.trueArr)
-				})
+					} else {
+						this.trueArr.push(index);
+						this.trueArr = this.trueArr.sort(); // 选项排序
+					}
+					this.getAnswerOrder(this.trueArr);
+				});
 			},
-			
+
 			/* 获取最新答案选项 */
-			getAnswerOrder(arr){
-				let arr2 = []
-				arr.forEach(i => {
-					arr2.push(this.getOrderCode(i))
-				})
-				this.multipleAnswers = arr2.sort()
+			getAnswerOrder(arr) {
+				let arr2 = [];
+				arr.forEach((i) => {
+					arr2.push(this.getOrderCode(i));
+				});
+				this.multipleAnswers = arr2.sort();
 			},
-			
+
 			/* 根据index获取对应选项字母的值 */
-			getOrderCode(index){
-				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName('option-order'))
-				for(let i=0;i<wraps.length;i++){
-					let item = wraps[i]
-					if(+index === +item.dataset.index){
-						return item.innerText
+			getOrderCode(index) {
+				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName("option-order"));
+				for (let i = 0; i < wraps.length; i++) {
+					let item = wraps[i];
+					if (+index === +item.dataset.index) {
+						return item.innerText;
 						break;
 					}
 				}
 			},
-			
+
 			/* 根据页面上的选项DOM数量,刷新每个选项的Order显示 */
 			refreshOrder() {
-				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName('option-order'))
+				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName("option-order"));
 				wraps.forEach((item, index) => {
-					item.innerHTML = this.renderIndex(index)
-				})
+					item.innerHTML = this.renderIndex(index);
+				});
 			},
-			
+
 			/* 根据下标渲染对应的字母顺序 */
 			renderIndex(index) {
-				return String.fromCharCode(64 + parseInt(index + 1))
+				return String.fromCharCode(64 + parseInt(index + 1));
 			},
-			
-			
 
 			/* 删除选项 */
-			deleteOption(index,item) {
+			deleteOption(index, item) {
 				// 拿到所有选项
-				if (this.existOptions.length > 2 ) {
+				if (this.existOptions.length > 2) {
 					// 如果删除的是正确答案 则重置正确答案
-					if(this.trueArr.indexOf(index) > -1){
-						if(this.trueArr.length === 1){
-							this.$Message.warning(this.$t('evaluation.addTip3'))
-						}else{
-							this.trueArr.splice(this.trueArr.indexOf(index),1)
+					if (this.trueArr.indexOf(index) > -1) {
+						if (this.trueArr.length === 1) {
+							this.$Message.warning(this.$t("evaluation.addTip3"));
+						} else {
+							this.trueArr.splice(this.trueArr.indexOf(index), 1);
 							// 确保当前存在的options保持同步
-							this.existOptions.splice(this.existOptions.indexOf(item), 1)
-							this.optionsContent.splice(index, 1)
+							this.existOptions.splice(this.existOptions.indexOf(item), 1);
+							this.optionsContent.splice(index, 1);
 							// 删除操作 移除选项DOM
-							let textWrap = this.$refs['optionBox' + index][0]
-							textWrap.remove()
+							let textWrap = this.$refs["optionBox" + index][0];
+							textWrap.remove();
 							// 刷新选项序号显示
-							this.refreshOrder()
-							this.getAnswerOrder(this.trueArr)
+							this.refreshOrder();
+							this.getAnswerOrder(this.trueArr);
 						}
-					}else{
+					} else {
 						// 确保当前存在的options保持同步
-						this.existOptions.splice(this.existOptions.indexOf(item), 1)
-						this.optionsContent.splice(index, 1)
+						this.existOptions.splice(this.existOptions.indexOf(item), 1);
+						this.optionsContent.splice(index, 1);
 						// 删除操作 移除选项DOM
-						let textWrap = this.$refs['optionBox' + index][0]
-						textWrap.remove()
+						let textWrap = this.$refs["optionBox" + index][0];
+						textWrap.remove();
 						// 刷新选项序号显示
-						this.refreshOrder()
-						this.getAnswerOrder(this.trueArr)
+						this.refreshOrder();
+						this.getAnswerOrder(this.trueArr);
 					}
-					
 				} else {
-					this.$Message.warning(this.$t('evaluation.addTip4'))
+					this.$Message.warning(this.$t("evaluation.addTip4"));
 				}
 			},
 
 			/* 保存试题 获取最新选项数据 */
 			doSave() {
 				// 拿到当前还剩的选项DOM
-				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName('option-editor'))
-				let arr = []
+				let wraps = Array.from(this.$refs.optionRefs.getElementsByClassName("option-editor"));
+				let arr = [];
 				wraps.forEach((item, index) => {
 					// 遍历选项 找到对应的 Editor 然后获取编辑器里面的内容
-					let id = item.dataset.editorId
-					let curEditor = this.optionEditors.filter(i => i.id === id)[0]
-					if(curEditor){
+					let id = item.dataset.editorId;
+					let curEditor = this.optionEditors.filter((i) => i.id === id)[0];
+					if (curEditor) {
 						// 生成新的选项对象
 						let obj = {
 							code: String.fromCharCode(64 + parseInt(index + 1)),
 							value: curEditor.txt.html()
-						}
-						arr.push(obj)
+						};
+						arr.push(obj);
 					}
-					
-				})
-				this.optionsContent = arr
+				});
+				this.optionsContent = arr;
 			},
 
 			/* 模拟选项聚焦事件 */
 			optionClick(index) {
-				let allToolbars = document.getElementsByClassName('option-editor')
-				let that = this
+				let allToolbars = document.getElementsByClassName("option-editor");
+				let that = this;
 				for (let i = 0; i < allToolbars.length; i++) {
-					allToolbars[i].children[0].style.visibility = 'hidden'
+					allToolbars[i].children[0].style.visibility = "hidden";
 				}
-				setTimeout(function() {
-					let currentToolBar = that.$refs['singleOption' + index][0].children[0]
-					if(currentToolBar.clientHeight > 50){
-						currentToolBar.style.top = '-90px'
+				setTimeout(function () {
+					let currentToolBar = that.$refs["singleOption" + index][0].children[0];
+					if (currentToolBar.clientHeight > 50) {
+						currentToolBar.style.top = "-90px";
 					}
-					currentToolBar.style.visibility = 'visible'
-				}, 100)
+					currentToolBar.style.visibility = "visible";
+				}, 100);
 			},
 			/* 渲染多选题 */
-			doRender(editInfo){
-				this.editSingleInfo = editInfo
-				this.stemContent = editInfo.question
-				this.optionsContent = editInfo.option
-				this.multipleAnswers = editInfo.answer
-				this.trueArr = editInfo.answer.map(item => item.charCodeAt() - 65)
-				this.options = editInfo.option.map((item, index) => index)
-				this.existOptions = editInfo.option.map((item, index) => index)
+			doRender(editInfo) {
+				console.error("xxxxxxxxx3");
+				console.error(this.options);
+				this.editSingleInfo = editInfo;
+				this.stemContent = editInfo.question;
+				this.optionsContent = editInfo.option;
+				this.multipleAnswers = editInfo.answer;
+				this.trueArr = editInfo.answer.map((item) => item.charCodeAt() - 65);
+				this.options = editInfo.option.map((item, index) => index);
+				this.existOptions = editInfo.option.map((item, index) => index);
 				this.$nextTick(() => {
-					this.initEditors()
-					this.stemEditor.txt.html(editInfo.question)
-				})
+					this.initEditors();
+					this.stemEditor.txt.html(editInfo.question);
+				});
 			}
 		},
 		mounted() {
-			let stemEditor = new E(this.$refs.singleEditor)
+			let stemEditor = new E(this.$refs.singleEditor);
 			stemEditor.config.onchange = (html) => {
-				this.stemContent = html
-			}
+				this.stemContent = html;
+			};
 			stemEditor.config.uploadImgShowBase64 = true;
-			this.$editorTools.initMyEditor(stemEditor,this)
-			stemEditor.create()
-			this.stemEditor = stemEditor
-
-			if (this.editInfo && this.isEdit) { 
-				console.log('进入多选题Mounted编辑')
-				this.doRender(this.editInfo)
-			}else{
-				this.initEditors()
+			this.$editorTools.initMyEditor(stemEditor, this);
+			stemEditor.create();
+			this.stemEditor = stemEditor;
+			if (this.editInfo && Object.keys(this.editInfo).length > 0) {
+				this.doRender(this.editInfo);
 			}
 		},
 		computed: {
-		    // 选项顺序转化成字母
-		    showTrueAnswers() {
-		        let arr = this.trueArr.map(item => String.fromCharCode(64 + parseInt(item + 1)))
-		        this.transferArr = arr
-		        return this.transferArr.sort().join('')
-		    }
+			// 选项顺序转化成字母
+			showTrueAnswers() {
+				let arr = this.trueArr.map((item) => String.fromCharCode(64 + parseInt(item + 1)));
+				this.transferArr = arr;
+				return this.transferArr.sort().join("");
+			}
 		},
 		watch: {
 			editInfo: {
 				handler(newValue, oldValue) {
 					if (newValue) {
-						console.log('多选接收到的数据')
-						console.log(newValue)
-						this.editSingleInfo = newValue
-						if (Object.keys(newValue).length > 0) {
-							this.doRender(newValue)
-						}
+						this.options = [];
+						this.$nextTick(() => {
+							this.editSingleInfo = newValue;
+							if (Object.keys(newValue).length > 0) {
+								this.doRender(newValue);
+							} else {
+								this.options = [...new Array(4).keys()]
+								this.$nextTick(() => {
+									this.initEditors();
+								});
+							}
+						});
 					}
 				},
-				// immediate:true
-			},
-
+				immediate: true
+			}
 		}
-	}
+	};
 </script>
 <style lang="less" scoped>
-	@import"../index/CreateExercises.less";
+	@import "../index/CreateExercises.less";
 </style>

+ 22 - 18
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseSingle.vue

@@ -262,32 +262,36 @@
 					this.initEditors()
 					this.stemEditor.txt.html(this.editSingleInfo.question)
 				})
-			}else{
-				this.initEditors();
 			}
 		},
 		watch: {
 			editInfo: {
 				handler(newValue, oldValue) {	
 					if (newValue) {
-						console.log('单选接收到的数据')
-						console.log(newValue)
-						this.editSingleInfo = newValue
-						if (Object.keys(newValue).length > 0) {
-							this.stemContent = this.editSingleInfo.question
-							this.optionsContent = this.editSingleInfo.option
-							this.trueIndex = this.editSingleInfo.answer[0].charCodeAt() - 65
-							this.optionTrueIndex = this.editSingleInfo.answer[0].charCodeAt() - 65
-							this.options = this.editSingleInfo.option.map((item, index) => index)
-							this.existOptions = this.editSingleInfo.option.map((item, index) => index)
-							this.$nextTick(() => {
-								this.initEditors()
-								this.stemEditor.txt.html(this.editSingleInfo.question)
-							})
-						}
+						this.options = [];
+						this.$nextTick(() => {
+							this.editSingleInfo = newValue;
+							if (Object.keys(newValue).length > 0) {
+								this.stemContent = this.editSingleInfo.question
+								this.optionsContent = this.editSingleInfo.option
+								this.trueIndex = this.editSingleInfo.answer[0].charCodeAt() - 65
+								this.optionTrueIndex = this.editSingleInfo.answer[0].charCodeAt() - 65
+								this.options = this.editSingleInfo.option.map((item, index) => index)
+								this.existOptions = this.editSingleInfo.option.map((item, index) => index)
+								this.$nextTick(() => {
+									this.initEditors()
+									this.stemEditor.txt.html(this.editSingleInfo.question)
+								})
+							} else {
+								this.options = [...new Array(4).keys()]
+								this.$nextTick(() => {
+									this.initEditors();
+								});
+							}
+						});
 					}
 				},
-				// immediate:true
+				immediate:true
 			},
 
 		}

+ 2 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/tabs/AnswerTable.vue

@@ -877,6 +877,7 @@
 									let sName;
 									let sInfo = this.examInfo.subjects.find((item) => item.id === key);
 									if (sInfo) sName = sInfo.name;
+									var srcReg = /<img [^>]*src=['"]([^'"]+)[^>]*>/g;
 									subjectData[key].forEach((ss, ssIndex) => {
 										// 首次需要处理表头
 										if (flag) {
@@ -902,7 +903,7 @@
 										ss.score.forEach((s, i) => {
 											let sk = "Q" + (i + 1);
 											stuItem[sk] = s;
-											ansItem[sk] = JSON.parse(ansResults[ssIndex])[i][0] || "";
+											ansItem[sk] = JSON.parse(ansResults[ssIndex])[i][0]?.replaceAll(srcReg,'') || "";
 											t += s > -1 ? s : 0;
 										});
 										stuItem.total = t;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newsheet/BaseEditor.vue

@@ -958,7 +958,7 @@
 		position: relative;
 		width: 770px;
 		margin: 0 auto;
-		border: 1px solid #000 !important;
+		border: 2px solid #000 !important;
 
 		.cell-item {
 			display: inline-block;

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newsheet/SheetBaseInfo.vue

@@ -276,7 +276,7 @@
 				.attr({
 					fill: "rgba(0,0,0,0)",
 					stroke: "#000",
-					strokeWidth: 1,
+					strokeWidth: 2,
 					shapeRendering: "crispEdges",
 				});
 			// this.setInfoConfig()

+ 1 - 1
TEAMModelOS/ClientApp/src/view/newsheet/SheetObjective.vue

@@ -132,7 +132,7 @@
 						shapeRendering:"crispEdges",
 						fill: "none",
 						stroke: "black",
-						strokeWidth:1
+						strokeWidth:2
 					});
 				this.objectiveGroup.add(infoBox);
 				this.$EventBus.$emit('doRefresh')