Browse Source

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

zhouj1203@hotmail.com 2 years ago
parent
commit
8f94c8698e

+ 1 - 1
TEAMModelBI/Controllers/BITable/TableDingDingInfoController.cs

@@ -1187,7 +1187,7 @@ namespace TEAMModelBI.Controllers.BITable
             {
                 if (string.IsNullOrEmpty(user.roles))
                 {
-                    user.roles = "admin,assist";
+                    user.roles = "admin";
                 }
                 List<string> tempRoles = new(user.roles.Split(","));
                 if (!tempRoles.Contains("admin"))

+ 3 - 3
TEAMModelBI/TEAMModelBI.csproj

@@ -65,9 +65,9 @@
 		<SpaRoot>ClientApp\</SpaRoot>
 		<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**</DefaultItemExcludes>
 		<UserSecretsId>078b5d89-7d90-4f6a-88fc-7d96025990a8</UserSecretsId>
-		<Version>1.2211.18</Version>
-		<AssemblyVersion>1.2211.11.18</AssemblyVersion>
-		<FileVersion>1.2211.11.18</FileVersion>
+		<Version>1.2211.25</Version>
+		<AssemblyVersion>1.2211.25.1</AssemblyVersion>
+		<FileVersion>1.2211.25.1</FileVersion>
 		<Description>TEAMModelBI(BI)</Description>
 		<PackageReleaseNotes>BI版本说明版本切换标记2022000908</PackageReleaseNotes>
 		<PackageId>TEAMModelBI</PackageId>

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

@@ -2524,6 +2524,7 @@ const LANG_EN_US = {
             updOk: 'Modified successfully',
             updErr: 'Failed to modify',
             edName: 'Edit Name',
+            edAct: 'Modify activity',
             edNameHolder: 'Please enter the assessment name',
             scoreStatus: 'To be graded',
             scoreStatus1: 'Graded',
@@ -2548,8 +2549,10 @@ const LANG_EN_US = {
             shareText11: 'For a better user experience, please complete the online activity on your PC!',
             copy: 'Copy',
             copyTitle: 'Copy Assessment',
+            copyTitle1: 'Modify assessment',
             copyContent: 'Are you sure to copy the assessment?',
             copyContent1: 'Smarter Classroom Assessment cannot be copied.',
+            copyContent2: 'Are you sure to modify the current assessment? ',
             paperExam: 'SelfPace Test (Instant Paper)',
             loadAll: 'All data has been loaded',
             crossSchool: "Cross-school assessment, you can't view the participants in the current school"
@@ -4294,6 +4297,7 @@ const LANG_EN_US = {
             vote: "Poll",
             survey: "Survey",
             wrongTopic: "Incorrectly Answered Question Book",
+            wrongTopic1: "Intelligent practice",
             classInteraction: "Web IRS",
             achievement: "My Grade",
         },
@@ -4793,6 +4797,7 @@ const LANG_EN_US = {
                 wrongSub: "Incorrect",
                 rightSub: "Correct",
                 shwoPage: "Answer Card",
+                reAns: "Re-answer",
             },
             report: {
                 anwser: 'Start Answering',

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

@@ -2524,6 +2524,7 @@ const LANG_ZH_CN = {
             updOk: '修改成功',
             updErr: '修改失败',
             edName: '修改名称',
+            edAct: '修改活动内容',
             edNameHolder: '请输入活动名称',
             scoreStatus: '待评分',
             scoreStatus1: '已评分',
@@ -2548,8 +2549,10 @@ const LANG_ZH_CN = {
             shareText11: '为了更好的用户体验,请在PC端完成线上活动!',
             copy: '复制',
             copyTitle: '复制评测',
+            copyTitle1: '修改评测',
             copyContent: '确认复制当前评测吗?',
             copyContent1: '课中评测不能进行复制操作。',
+            copyContent2: '确认修改当前评测吗?',
             paperExam: '纸本测验',
             loadAll: '已加载所有数据',
             crossSchool: '跨校评测,在当前学校无法查看发布对象'
@@ -4297,6 +4300,7 @@ const LANG_ZH_CN = {
             vote: "投票",
             survey: "问卷",
             wrongTopic: "错题本",
+            wrongTopic1: "精准练习",
             classInteraction: "课堂互动",
             achievement: "我的成绩",
         },
@@ -4797,6 +4801,7 @@ const LANG_ZH_CN = {
                 wrongSub: "错题",
                 rightSub: "正确题目",
                 shwoPage: "答题卡",
+                reAns: "重新作答",
             },
             report: {
                 anwser: '前往作答',

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

@@ -2526,6 +2526,7 @@ const LANG_ZH_TW = {
             updOk: '修改成功',
             updErr: '修改失敗',
             edName: '修改名稱',
+            edAct: '修改活動內容',
             edNameHolder: '請輸入評量名稱',
             scoreStatus: '待評分',
             scoreStatus1: '已評分',
@@ -2550,8 +2551,10 @@ const LANG_ZH_TW = {
             shareText11: '為了更好的用戶體驗,請在PC端完成線上活動!',
             copy: '複製',
             copyTitle: '複製評量',
+            copyTitle1: '修改評量',
             copyContent: '確認複製當前評量嗎?',
             copyContent1: '課中評量不能進行複製操作。',
+            copyContent2: '確認修改當前評量嗎? ',
             paperExam: '紙本測驗',
             loadAll: '已載入所有數據',
             crossSchool: '跨校評量,在當前學校無法查看發布對象'
@@ -4298,6 +4301,7 @@ const LANG_ZH_TW = {
             vote: "投票",
             survey: "問卷",
             wrongTopic: "錯題本",
+            wrongTopic1: "精準練習",
             classInteraction: "課堂互動",
             achievement: "我的成績",
         },
@@ -4798,6 +4802,7 @@ const LANG_ZH_TW = {
                 wrongSub: "錯題",
                 rightSub: "正確題目",
                 shwoPage: "答題卡",
+                reAns: "重新作答",
             },
             report: {
                 anwser: '前往作答',

+ 5 - 1
TEAMModelOS/ClientApp/src/api/studentWeb.js

@@ -240,5 +240,9 @@ export default {
     // 艺术活动上传作品
     uploadArtFile: function(data) {
         return post("/common/art/upload", data)
-    }
+    },
+    // 根据题目id获取题目信息
+    getQuesInfo: function(data) {
+        return post("/item/find-ids", data)
+    },
 }

+ 1 - 1
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/AnswerBox.less

@@ -87,7 +87,7 @@
             width: 100%;
             display: flex;
             flex-wrap: wrap;
-            justify-content: center;
+            // justify-content: center;
 
             &>div {
                 width: 45%;

+ 214 - 203
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/AnswerBox.vue

@@ -5,89 +5,91 @@
             <span class="logout-icon" @click="openWarmMessage(1)">
                 <svg-icon icon-class="logout" />
             </span>
-            <span class="test-title">课程名称:罗老师小课堂</span>
+            <span class="test-title">{{ $t('studentWeb.baseInfo.subjectName')}}罗老师小课堂</span>
         </div>
-        <div class="answer-content" v-if="practiceType != 2 && practiceType != 5">
-            <vuescroll>
-                <!-- <div :class="['quertion-area', `size-${queNum}`, 'question-know']"> -->
-                <div :class="['quertion-area', `size-${queNum}`]">
-                    <div class="header" v-show="practiceType != 1">
-                        <span>【多选题】</span>
-                        <p @click="onCollection">
-                            <Icon custom="iconfont icon-shoucang1" size="21" color="#3B660C" v-show="!iscollection"></Icon>
-                            <Icon custom="iconfont icon-shoucang2" size="21" color="#EA8F3E" v-show="iscollection"></Icon>
-                            <span>收藏</span>
-                        </p>
+        <template v-if="quesInfo">
+            <div class="answer-content" v-if="practiceType != 2 && practiceType != 5">
+                <vuescroll>
+                    <!-- <div :class="['quertion-area', `size-${queNum}`, 'question-know']"> -->
+                    <div :class="['quertion-area', `size-${queNum}`]">
+                        <div class="header" v-show="practiceType != 1">
+                            <span>【{{ testType[quesInfo.type] }}】</span>
+                            <p @click="onCollection">
+                                <Icon custom="iconfont icon-shoucang1" size="21" color="#3B660C" v-show="!iscollection"></Icon>
+                                <Icon custom="iconfont icon-shoucang2" size="21" color="#EA8F3E" v-show="iscollection"></Icon>
+                                <span>{{ $t('syllabus.save')}}</span>
+                            </p>
+                        </div>
+                        <div v-html="quesInfo.question"></div>
                     </div>
-                    <div v-html="question"></div>
-                </div>
-                <template v-if="practiceType === 3 || practiceType === 4">
-                    <div class="code-box" v-if="false">
-                        <div v-for="(item, index) in codeList" :key="index">
-                            <div :class="['code-block', isChecked(item.code) ? 'code-block-active' : '']" :tabIndex="index"
-                                @click="onAnswerCheck(item, index)" :style="{'cursor': practiceType === 3 ? 'pointer' : 'no-drop'}"
-                            >
-                                <span class="code-label">{{ item.code }}</span>
-                                <span v-html="item.value"></span>
-                                <template v-if="practiceType === 4">
-                                    <Icon custom="iconfont icon-choose" class="code-icon" color="#3B660C"></Icon>
-                                    <Icon custom="iconfont icon-cuowu" class="code-icon" color="#DB5248"></Icon>
-                                </template>
+                    <template v-if="practiceType === 3 || practiceType === 4">
+                        <div class="code-box" v-if="quesInfo.type === 'judge' || quesInfo.type === 'single'  || quesInfo.type === 'multiple'">
+                            <div v-for="(item, index) in quesInfo.option" :key="index">
+                                <div :class="['code-block', isChecked(item.code) ? 'code-block-active' : '']" :tabIndex="index"
+                                    @click="onAnswerCheck(item, index)" :style="{'cursor': practiceType === 3 ? 'pointer' : 'no-drop'}"
+                                >
+                                    <span class="code-label">{{ item.code }}</span>
+                                    <span v-html="item.value"></span>
+                                    <template v-if="practiceType === 4">
+                                        <Icon custom="iconfont icon-choose" class="code-icon" color="#3B660C"
+                                            v-show="quesInfo.answer.includes(item.code)"
+                                        ></Icon>
+                                        <Icon custom="iconfont icon-cuowu" class="code-icon" color="#DB5248"
+                                            v-show="!quesInfo.answer.includes(item.code) && checkedAnswerList.includes(item.code)"
+                                        ></Icon>
+                                    </template>
+                                </div>
                             </div>
                         </div>
+                        <div class="compose-content" v-else>
+                            <Compose ref="compose" :itemInfo="itemInfo" :textData="checkedAnswerList"
+                                :index="1" @dataGet="getComposeAns" :close="practiceType === 4"
+                            ></Compose>
+                        </div>
+                        <!-- <div class="answer-area" v-else>
+                            <span class="answer-tip">我的答案:</span>
+                            <p v-html="checkedAnswerList[0]"></p>
+                        </div> -->
+                    </template>
+                    <div v-if="practiceType === 1 || practiceType === 4">
+                        <div class="answer-area">
+                            <span class="answer-tip">【{{ $t('evaluation.answer')}}】</span>
+                            <p v-for="(answerC, indexCA) in quesInfo.answer" :key="indexCA" v-html="answerC"></p>
+                        </div>
+                        <div class="answer-area">
+                            <span class="answer-tip">【{{ $t('evaluation.explain')}}】</span>
+                            <p v-html="quesInfo.explain"></p>
+                        </div>
                     </div>
-                    <div class="compose-content" v-if="practiceType === 3">
-                        <Compose ref="compose" :itemInfo="itemInfo" :close="false" :textData="checkedAnswerList"
-                            :index="1" @dataGet="getComposeAns"
-                        ></Compose>
-                    </div>
-                    <div class="answer-area" v-else>
-                        <span class="answer-tip">我的答案:</span>
-                        <p v-html="checkedAnswerList[0]"></p>
-                    </div>
+                </vuescroll>
+            </div>
+            <div class="question-content quertion-area" v-if="practiceType === 2">
+                <Icon custom="iconfont icon-wenhao" class="quertion-icon"></Icon>
+                <vuescroll>
+                    <div :class="[`size-${queNum}`]" v-html="quesInfo.question"></div>
+                </vuescroll>
+            </div>
+            <div class="rest-box" v-if="practiceType === 5">
+                <p>让脑袋冷静一下</p>
+                <p>休息一下再继续</p>
+                <Icon custom="iconfont icon-kafei"></Icon>
+            </div>
+            <div class="function-button">
+                <Button class="common-button only-button" style="background: #84ba48" v-if="practiceType === 1" @click="goTo(2)">了解了</Button>
+                <template v-if="practiceType === 2">
+                    <Button class="common-button" style="background: #84ba48" @click="goTo(3, 1)">肯定会</Button>
+                    <Button class="common-button" style="background: #b9c746" @click="goTo(3, 2)">应该会</Button>
+                    <Button class="common-button" style="background: #da933b" @click="goTo(3, 3)">不太会</Button>
+                    <Button class="common-button" style="background: #c2543f" @click="goTo(3, 4)">不会</Button>
                 </template>
-                <div v-if="practiceType === 1 || practiceType === 4">
-                    <div class="answer-area">
-                        <span class="answer-tip">【答案】</span>
-                        <p>
-                            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟,如“安得广厦千万间,大庇天下寒士俱欢颜"这样的诗句,表现出作者在自己生活极度艰难的情景下,依然不忘忧国忧民,情真意切.感人至深。
-                        </p>
-                    </div>
-                    <div class="answer-area">
-                        <span class="answer-tip">【解析】</span>
-                        <p>
-                            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-                        </p>
-                    </div>
-                </div>
-            </vuescroll>
-        </div>
-        <div class="question-content quertion-area" v-if="practiceType === 2">
-            <Icon custom="iconfont icon-wenhao" class="quertion-icon"></Icon>
-            <vuescroll>
-                <div :class="[`size-${queNum}`]" v-html="question"></div>
-            </vuescroll>
-        </div>
-        <div class="rest-box" v-if="practiceType === 5">
-            <p>让脑袋冷静一下</p>
-            <p>休息一下再继续</p>
-            <Icon custom="iconfont icon-kafei"></Icon>
-        </div>
-        <div class="function-button">
-            <Button class="common-button only-button" style="background: #84ba48" v-if="practiceType === 1" @click="goTo(2)">了解了</Button>
-            <template v-if="practiceType === 2">
-                <Button class="common-button" style="background: #84ba48" @click="goTo(3)">肯定会</Button>
-                <Button class="common-button" style="background: #b9c746" @click="goTo(3)">应该会</Button>
-                <Button class="common-button" style="background: #da933b" @click="goTo(3)">不太会</Button>
-                <Button class="common-button" style="background: #c2543f" @click="goTo(3)">不会</Button>
-            </template>
-            <Button class="common-button only-button" style="background: #c0c0c0" v-if="practiceType === 3" @click="goTo(4)">提交</Button>
-            <Button class="common-button only-button" style="background: #84ba48" v-if="practiceType === 4" @click="goTo(0)">继续</Button>
-            <template v-if="practiceType === 5">
-                <Button class="common-button rest-button" style="background: #84ba48" @click="goTo(1)">活力满满,继续</Button>
-                <Button class="common-button rest-button" style="background: #c0c0c0" @click="openWarmMessage(1)">改天再练,先离开</Button>
-            </template>
-        </div>
+                <Button class="common-button only-button" style="background: #c0c0c0" v-if="practiceType === 3" @click="goTo(4)">{{ $t('studentWeb.classmatesComment.submitted') }}</Button>
+                <Button class="common-button only-button" style="background: #84ba48" v-if="practiceType === 4" @click="goTo(0)">继续</Button>
+                <template v-if="practiceType === 5">
+                    <Button class="common-button rest-button" style="background: #84ba48" @click="goTo(mode === 'wrong' ? 2 : 1)">活力满满,继续</Button>
+                    <Button class="common-button rest-button" style="background: #c0c0c0" @click="openWarmMessage(1)">改天再练,先离开</Button>
+                </template>
+            </div>
+        </template>
         <!-- <div class="analysis">解析</div> -->
     </div>
 </template>
@@ -104,18 +106,6 @@ export default {
     data() {
         return {
             isLoading: false,
-            question: `
-            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-            <img src="./student-en-us.png" alt="">`,
-            /* question: `I heard the echo, from the valleys and the heart
-                Open to the lonely soul of sickle harvesting I heard the echo, from the valleys and the heart
-                Repeat outrightly, but also repea also repeat the well-being of Eventualy soul of sickle harvesting I heard the echo, from the valleys and the heart
-                Repeat outrightly, but also repeat the well- 
-                Open to the lonely soul of sickle harvesting I heard the echo, from the valleys and the heart
-                Eventua<img src="./student-en-us.png" alt="">`, */
             codeList: [
                 {code: "A", value: `这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟,如“安得广厦千万间,大庇天下寒士俱欢颜"这样的诗句,
                     表现出作者在自己生活极度艰难的情景下,依然不忘忧国忧民,情真意切.感人至深。`},
@@ -130,10 +120,23 @@ export default {
             checkedAnswerList: [],
             iscollection: false,
             itemInfo: {},
-            quesList: [],
-            qsAll: [],
-            nowIndex: 0,
+            exerciseInfo: [], //练习时选择的数据
+            qsAll: [], //需要练习的题目id和状态
+            quesContent: [], //所有题目信息
+            nowIndex: 0, //当前题目的序号
             practiceType: 1, //1:学习,2:询问,3:作答,4:答案,5:休息
+            quesInfo: undefined,
+            testType: {
+                single: this.$t('studentWeb.exam.queType.single'),
+                multiple: this.$t('studentWeb.exam.queType.multiply'),
+                judge: this.$t('studentWeb.exam.queType.judge'),
+                complete: this.$t('studentWeb.exam.queType.complete'),
+                subjective: this.$t('studentWeb.exam.queType.subjective'),
+                compose: this.$t('studentWeb.exam.queType.compose'),
+                correct: this.$t('studentWeb.exam.queType.correct'),
+                connector: this.$t('studentWeb.exam.queType.connector'),
+            },
+            mode: 'wrong', //练习模式
         }
     },
     computed: {
@@ -143,8 +146,8 @@ export default {
         queNum() {
             // 计算字节数
             let len = 0
-            for (var i = 0; i < this.question.length; i++) {
-                var c = this.question.charCodeAt(i)
+            for (var i = 0; i < this.quesInfo.question.length; i++) {
+                var c = this.quesInfo.question.charCodeAt(i)
                 //单字节加1
                 if (
                     (c >= 0x0001 && c <= 0x007e) ||
@@ -167,113 +170,71 @@ export default {
             }
         },
     },
-    mounted () {
+    watch: {
+        nowIndex: {
+            handler(n, o) {
+                this.quesInfo = this.quesContent[n]
+            }
+        },
+    },
+    created () {
         this.qsAll = this.$route.params.qsList
-        this.quesList = [
-            {
-                "q_id":"f5adefef-44fc-43a1-7de6-fa1f8afa5f2b",
-                "index":0,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":null,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":2
-            },{
-                "q_id":"baff9b62-7978-1ebb-8f36-af2bb78cd853",
-                "index":1,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":6,
-                "correctness":0,
-                "end_time":1665651561,
-                "confidence_level":4
-            },{
-                "q_id":"6df25a81-41ac-1e1a-78bd-5377c8d2ce4f",
-                "index":2,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":7,
-                "correctness":0,
-                "end_time":1665651561,
-                "confidence_level":1
-            },{
-                "q_id":"1d62b867-2923-3700-ca72-ed9bad257303",
-                "index":3,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":null,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":3
-            },{
-                "q_id":"d8e382a5-b713-0657-d197-4d7935ddf386",
-                "index":4,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":null,
-                "correctness":0,
-                "end_time":1665651561,
-                "confidence_level":3
-            },{
-                "q_id":"b67bd57a-d19e-b6d0-5e03-b1c184362b2d",
-                "index":5,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":1,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":4
-            },{
-                "q_id":"c13d70a5-0952-bc4e-d7bf-a9bda829afe2",
-                "index":6,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":null,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":1
-            },{
-                "q_id":"b0dcda93-a191-ad1f-a3c7-58c373131c49",
-                "index":7,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":2,
-                "correctness":0,
-                "end_time":1665651561,
-                "confidence_level":2
-            },{
-                "q_id":"5de46f22-cce9-f4b0-aeb8-b3e648671bbf",
-                "index":8,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":null,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":1
-            },{
-                "q_id":"a9cd68d1-7148-1bb4-9d91-5b63db7da1f3",
-                "index":9,
-                "unit_id":10,
-                "skill_id":6101,
-                "start_time":1665651534,
-                "difficulty":5,
-                "correctness":1,
-                "end_time":1665651561,
-                "confidence_level":4
-            },
-        ]
+        this.mode = this.$route.params.mode
+        this.practiceType = this.$route.params.mode === 'wrong' ? 2 : 1
+        this.getQuesContent()
+    },
+    mounted () {
     },
     methods: {
+        // 获取题目详情
+        getQuesContent() {
+            this.isLoading = true
+            let param = {
+                "scope": "school",
+                "code": this.userInfo.scope === 'student' ? this.userInfo.azp : this.userInfo.sub,
+                "ids": []
+            }
+            param.ids = this.qsAll.map(item => {
+                return item.q_id
+            })
+            this.$api.studentWeb.getQuesInfo(param).then(async res => {
+                if(res.items.length) {
+                    let sas = await this.getSas()
+                    res.items.map(async (item, index) => {
+                        this.exerciseInfo.push({
+                            "q_id": item.id,
+                            "index": index,
+                            user_id: this.userInfo.sub,
+                            "unit_id": 10, //单元id
+                            "skill_id": item.knowledge, //只有知识点内容,没有id
+                            "start_time": null,
+                            "difficulty":null,
+                            "correctness": null, //答题对错(0,1)
+                            "end_time": null,
+                            "confidence_level": null, //答题信心
+                        })
+                        let fullPath = sas.url + '/' + param.code + item.blob + "?" + sas.sas
+                        let info = JSON.parse(await this.$tools.getFile(fullPath))
+                        // 综合题有子题,还需要处理
+                        let infoNeed = info.exercise
+                        infoNeed.question = info.item[0].question
+                        infoNeed.option = info.item[0].option
+                        this.quesContent.push(infoNeed)
+                        if(!index) {
+                            this.quesInfo = infoNeed
+                        }
+                    })
+                    this.isLoading = false
+                }
+            })
+        },
+        getSas() {
+            return new Promise(async (r, j) => {
+                let code = this.userInfo.scope === 'student' ? this.userInfo.azp : this.userInfo.sub
+                let sasInfo = await this.$tools.getBlobSas(code)
+                r(sasInfo)
+            })
+        },
         // 选项点击事件
         onAnswerCheck(item, index) {
             if(this.practiceType === 4) {
@@ -284,7 +245,7 @@ export default {
             if (isExistIndex > -1) {
                 this.checkedAnswerList.splice(isExistIndex, 1)
             } else {
-                if(true) { //单选
+                if(this.quesInfo.type != 'multiple') { //单选
                     this.checkedAnswerList.length = 0
                 }
                 this.checkedAnswerList.push(item.code)
@@ -305,7 +266,44 @@ export default {
             }
         },
         // 下一步该做什么
-        goTo(type) {
+        goTo(type, confidence) {
+            let time = new Date().getTime()
+            if(type === 3) {
+                this.exerciseInfo[this.nowIndex].confidence_level = confidence
+                this.exerciseInfo[this.nowIndex].start_time = time
+            } else if(type === 4) {
+                let objectiveTypes = ["single", "multiple", "judge"]
+                let corre = null
+                if(objectiveTypes.includes(this.quesInfo.type)) {
+                    if(this.quesInfo.type != "multiple") {
+                        if(this.checkedAnswerList[0] == this.quesInfo.answer[0]) {
+                            corre = 1
+                        } else {
+                            corre = 0
+                        }
+                    }
+                    // 多选
+                    else {
+                        let answer = this.quesInfo.answer
+                        let q = 0
+                        this.checkedAnswerList.map(item => {
+                            for (let i = 0; i < answer.length; i++) {
+                                if(item == answer[i]) {
+                                    q += 1
+                                    break
+                                }
+                            }
+                        })
+                        if(answer.length === q) {
+                            corre = 1
+                        } else {
+                            corre = 0
+                        }
+                    }
+                }
+                this.exerciseInfo[this.nowIndex].end_time = time
+                this.exerciseInfo[this.nowIndex].correctness = corre
+            }
             if(type) {
                 // 没有作答点击提交
                 if(type === 4 && !this.checkedAnswerList.length) {
@@ -314,9 +312,22 @@ export default {
                     this.practiceType = type
                 }
             } else {
-                this.checkedAnswerList = []
                 // 根据做题进度进入(学习/休息)界面
-                this.practiceType = 5
+                if(this.nowIndex === (this.quesContent.length - 1)) {
+                    this.$Modal.confirm({
+                        title: '当前习题已全部完成练习',
+                        okText: '离开',
+                        cancelText: this.$t("studentWeb.exam.delCancel"),
+                        onOk: () => {
+                            this.quitTest()
+                        }
+                    })
+                } else {
+                    this.checkedAnswerList = []
+                    this.nowIndex += 1
+                    // 先做5题休息
+                    this.practiceType = (this.nowIndex + 1) % 5 ? (this.mode === 'wrong' ? 2 : 1) : 5
+                }
             }
         },
         //打开提示信息
@@ -329,7 +340,7 @@ export default {
         quitTest() {
             let param = {
                 sid: this.userInfo.sub,
-                record: this.quesList
+                record: this.exerciseInfo
             }
             this.isLoading = true
             this.$router.go(-1)

+ 76 - 3
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/PreciseQues.vue

@@ -41,7 +41,7 @@
         <div class="charts-box">
             <div id="Difficulty"></div>
         </div>
-        <Modal v-model="isReview" class="student-check no-ok" title="练习列表">
+        <Modal v-model="isReview" class="student-check no-ok" title="练习列表" width="50">
             <div v-for="(item, index) in quesList" :key="index" class="ques-list">
                 <img src="./student-en-us.png" alt="">
                 <div class="ques-content">
@@ -56,16 +56,19 @@
                         </span>
                     </div>
                 </div>
-                <Button @click="startReview">开始练习</Button>
+                <Button @click="startReview(item.id)">开始练习</Button>
             </div>
         </Modal>
     </div>
 </template>
 
 <script>
+import { mapState } from 'vuex'
 export default {
     data () {
         return {
+            MyNo: "12", //接收NavBar 選定的那一頁icon標示
+            MyName: "",
             isReview: false,
             filtType: {
                 term: 0,
@@ -73,21 +76,25 @@ export default {
             },
             quesList: [
                 {
+                    id: "1",
                     name: "语文古诗词",
                     prc: "24",
                     know: "12",
                 },
                 {
+                    id: "2",
                     name: "语文古诗词",
                     prc: "24",
                     know: "12",
                 },
                 {
+                    id: "3",
                     name: "语文古诗词",
                     prc: "24",
                     know: "12",
                 },
                 {
+                    id: "4",
                     name: "语文古诗词",
                     prc: "24",
                     know: "12",
@@ -95,16 +102,82 @@ export default {
             ]
         }
     },
+    created () {
+        this.MyName = this.$t('studentWeb.type.wrongTopic1');
+        this.$emit("onNavNo", this.MyNo);
+        this.$emit("onNavName", this.MyName);
+    },
     mounted () {
         this.setMap()
     },
+    computed: {
+        ...mapState({
+            userInfo: state => state.userInfo,
+        })
+    },
     methods: {
         openModal() {
             this.isReview = true
         },
-        startReview() {
+        startReview(id) {
+            let param = {
+                sid: this.userInfo.sub,
+                unit_id: id, //单元id
+                mode: 0, //0:错题复习,1:学习+复习
+                t: Date.now()
+            }
+            // "Q_s":题目状态,可以此数值排序,数值越小应越早练习
+            let record = [
+                {
+                    "q_id": "f5adefef-44fc-43a1-7de6-fa1f8afa5f2b",
+                    "Q_s": 0.2388560312
+                },
+                {
+                    "q_id": "baff9b62-7978-1ebb-8f36-af2bb78cd853",
+                    "Q_s": 0.1244064826
+                },
+                {
+                    "q_id": "6df25a81-41ac-1e1a-78bd-5377c8d2ce4f",
+                    "Q_s": 0.243247358
+                },
+                {
+                    "q_id": "1d62b867-2923-3700-ca72-ed9bad257303",
+                    "Q_s": 0.0
+                },
+                {
+                    "q_id": "d8e382a5-b713-0657-d197-4d7935ddf386",
+                    "Q_s": 0.9004817513
+                },
+                {
+                    "q_id": "b67bd57a-d19e-b6d0-5e03-b1c184362b2d",
+                    "Q_s": 0.106642678
+                },
+                {
+                    "q_id": "c13d70a5-0952-bc4e-d7bf-a9bda829afe2",
+                    "Q_s": 0.1379331019
+                },
+                {
+                    "q_id": "b0dcda93-a191-ad1f-a3c7-58c373131c49",
+                    "Q_s": 0.1419861052
+                },
+                {
+                    "q_id": "5de46f22-cce9-f4b0-aeb8-b3e648671bbf",
+                    "Q_s": 0.0
+                },
+                {
+                    "q_id": "a9cd68d1-7148-1bb4-9d91-5b63db7da1f3",
+                    "Q_s": 0.0
+                },
+            ]
+            record.sort((a, b) => {
+                return a.Q_s - b.Q_s
+            })
             this.$router.push({
                 name: "answer",
+                params: {
+                    qsList: record,
+                    mode: 'wrong'
+                },
             })
         },
         setMap() {

+ 3 - 3
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/QuesContent.less

@@ -84,12 +84,12 @@
     margin-bottom: 25px;
 
     &>img {
-        width: 90px;
+        width: 150px;
     }
 
     .ques-content {
-        width: 60%;
-        font-size: 12px;
+        width: 70%;
+        font-size: 15px;
 
         .tip-foot {
             &>span:first-child {

+ 24 - 1
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/QuesList.less

@@ -3,7 +3,30 @@
 .wrong-ques {
     width: 100%;
     height: 100%;
-    position: relative;
+    // position: relative;
+
+    .title-box {
+        width: 100%;
+        height: 45px;
+        background-color: #FFFFFF;
+        position: absolute;
+        top: 0;
+        left: 0;
+        z-index: 6;
+        border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+        color: #24b880;
+        font-size: 20px;
+        padding: 5px 15px;
+
+        .logout-icon {
+            cursor: pointer;
+        }
+
+        .test-title {
+            margin-left: 10px;
+            font-weight: bold;
+        }
+    }
 
     .filter-type {
         padding: 25px 30px;

+ 148 - 134
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/QuesList.vue

@@ -1,145 +1,152 @@
 <template>
     <div class="wrong-ques student-check">
+        <Loading v-show="isLoading" bgColor="rgba(0, 0, 0, 0.3)"></Loading>
+        <div class="title-box">
+            <span class="logout-icon" @click="quitTest">
+                <svg-icon icon-class="logout" />
+            </span>
+            <span class="test-title">课程名称:罗老师小课堂</span>
+        </div>
         <Scroll class="list-scroll">
-        <!-- 筛选 -->
-        <div :class="['filter-type', {'show-filter': isOpen, 'no-filter': winHeight}]">
-            <div>
-                <span class="type-name">{{ $t('studentWeb.wrongTopic.subject') }}:</span>
-                <RadioGroup v-model="filtSubject" type="button" button-style="solid" @on-change="subjChange">
-                    <Radio v-for="(item, index) in subjectList" :key="index" :label="index">{{ item.name }}</Radio>
-                </RadioGroup>
-            </div>
-            <div>
-                <span class="type-name">{{ $t('studentWeb.wrongTopic.type') }}:</span>
-                <RadioGroup v-model="filtType" type="button" button-style="solid" @on-change="typeChange">
-                    <Radio v-for="(item, index) in typeList" :key="index" :label="index">{{ item }}</Radio>
-                </RadioGroup>
-            </div>
-            <!-- <div>
-                <span class="type-name">{{ $t('studentWeb.wrongTopic.diff') }}:</span>
-                <RadioGroup v-model="filtDiff" type="button" button-style="solid" @on-change="diffChange">
-                    <Radio :label="0">{{ $t("studentWeb.type.all") }}</Radio>
-                    <Radio v-for="(item, index) in diffList" :key="index + 1" :label="index + 1">{{ item }}</Radio>
-                </RadioGroup>
-            </div>
-            <div>
-                <span class="type-name">{{ $t('studentWeb.wrongTopic.level') }}:</span>
-                <RadioGroup v-model="filtLevel" type="button" button-style="solid" @on-change="levelChange">
-                    <Radio v-for="(item, index) in levelList" :key="index" :label="index">{{ item }}</Radio>
-                </RadioGroup>
-            </div> -->
-            <div>
-                <span class="type-name">收藏:</span>
-                <RadioGroup v-model="filtLevel" type="button" button-style="solid" @on-change="levelChange">
-                    <Radio :label="0">全部</Radio>
-                    <Radio :label="1">已收藏</Radio>
-                    <Radio :label="2">未收藏</Radio>
-                </RadioGroup>
-            </div>
-            <div>
-                <span class="type-name">排序:</span>
-                <Select v-model="filtLevel" style="width:250px">
-                    <Option :value="0">首次答错时间排序</Option>
-                    <Option :value="1">最近练习时间排序</Option>
-                </Select>
-            </div>
-            <!-- <div>
-                <span class="type-name">{{ $t('studentWeb.wrongTopic.point') }}:</span>
-                <template v-if="showPoint.length">
-                    <span v-for="(item, index) in showPoint" :key="index" class="point-box">
-                        {{ item.name }}
-                        <Icon type="md-close" @click="removePoint(index)" />
+            <!-- 筛选 -->
+            <div :class="['filter-type', {'show-filter': isOpen, 'no-filter': winHeight}]">
+                <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.subject') }}:</span>
+                    <RadioGroup v-model="filtSubject" type="button" button-style="solid" @on-change="subjChange">
+                        <Radio v-for="(item, index) in subjectList" :key="index" :label="index">{{ item.name }}</Radio>
+                    </RadioGroup>
+                </div>
+                <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.type') }}:</span>
+                    <RadioGroup v-model="filtType" type="button" button-style="solid" @on-change="typeChange">
+                        <Radio v-for="(item, index) in typeList" :key="index" :label="index">{{ item }}</Radio>
+                    </RadioGroup>
+                </div>
+                <!-- <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.diff') }}:</span>
+                    <RadioGroup v-model="filtDiff" type="button" button-style="solid" @on-change="diffChange">
+                        <Radio :label="0">{{ $t("studentWeb.type.all") }}</Radio>
+                        <Radio v-for="(item, index) in diffList" :key="index + 1" :label="index + 1">{{ item }}</Radio>
+                    </RadioGroup>
+                </div>
+                <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.level') }}:</span>
+                    <RadioGroup v-model="filtLevel" type="button" button-style="solid" @on-change="levelChange">
+                        <Radio v-for="(item, index) in levelList" :key="index" :label="index">{{ item }}</Radio>
+                    </RadioGroup>
+                </div> -->
+                <div>
+                    <span class="type-name">收藏:</span>
+                    <RadioGroup v-model="filtLevel" type="button" button-style="solid" @on-change="levelChange">
+                        <Radio :label="0">全部</Radio>
+                        <Radio :label="1">已收藏</Radio>
+                        <Radio :label="2">未收藏</Radio>
+                    </RadioGroup>
+                </div>
+                <div>
+                    <span class="type-name">排序:</span>
+                    <Select v-model="filtLevel" style="width:250px">
+                        <Option :value="0">首次答错时间排序</Option>
+                        <Option :value="1">最近练习时间排序</Option>
+                    </Select>
+                </div>
+                <!-- <div>
+                    <span class="type-name">{{ $t('studentWeb.wrongTopic.point') }}:</span>
+                    <template v-if="showPoint.length">
+                        <span v-for="(item, index) in showPoint" :key="index" class="point-box">
+                            {{ item.name }}
+                            <Icon type="md-close" @click="removePoint(index)" />
+                        </span>
+                    </template>
+                    <Icon type="md-add-circle" size="18" color="#24B880" @click="pointShow = true" />
+                </div> -->
+                <div class="search">
+                    <Input v-model="subTitle" :placeholder="$t('studentWeb.wrongTopic.search')" style="width: 302px" class="light-iview-input"
+                            @on-change="searchChange" clearable />
+                    <!-- <DatePicker type="date" :placeholder="$t('studentWeb.wrongTopic.date')" :options="options" @on-change="dateChange"
+                                style="width: 200px" class="light-iview-input"
+                    /> -->
+                    <span class="have-total">
+                        {{ $t('studentWeb.wrongTopic.word1') }}
+                        <span>{{ topicTotal }}</span>
+                        {{ $t('studentWeb.wrongTopic.topic') }}
                     </span>
-                </template>
-                <Icon type="md-add-circle" size="18" color="#24B880" @click="pointShow = true" />
-            </div> -->
-            <div class="search">
-                <Input v-model="subTitle" :placeholder="$t('studentWeb.wrongTopic.search')" style="width: 302px" class="light-iview-input"
-                        @on-change="searchChange" clearable />
-                <!-- <DatePicker type="date" :placeholder="$t('studentWeb.wrongTopic.date')" :options="options" @on-change="dateChange"
-                            style="width: 200px" class="light-iview-input"
-                /> -->
-                <span class="have-total">
-                    {{ $t('studentWeb.wrongTopic.word1') }}
-                    <span>{{ topicTotal }}</span>
-                    {{ $t('studentWeb.wrongTopic.topic') }}
-                </span>
+                </div>
+                <Icon type="md-arrow-dropdown" @click="isOpen = !isOpen" v-show="!isOpen" />
+                <Icon type="md-arrow-dropup" @click="isOpen = !isOpen" v-show="isOpen" />
             </div>
-            <Icon type="md-arrow-dropdown" @click="isOpen = !isOpen" v-show="!isOpen" />
-            <Icon type="md-arrow-dropup" @click="isOpen = !isOpen" v-show="isOpen" />
-        </div>
-        <!-- 题目列表 -->
-        <div class="topic-list">
-            <!-- <div style="overflow: hidden;">
-                <Checkbox v-model="checkAll">{{ $t('studentWeb.wrongTopic.allTopic') }}</Checkbox>
-                <span style="float: right">
-                    {{ $t('studentWeb.wrongTopic.check') }}:
-                    <span style="font-size: 18px; font-weight: bold;">{{ checkNum }}</span>
-                    <span :class="['start-btn-primary', {'start-btn': checkNum}]" @click="startPra">{{ $t('studentWeb.wrongTopic.startPractice') }}</span>
-                </span>
-            </div> -->
-            <template v-if="exerciseList.length">
-                <!-- <Scroll class="list-scroll"> -->
-                    <!-- <CheckboxGroup v-model="checkTopicArr"> -->
-                        <!-- <Checkbox :label="index" v-for="(item, index) in exerciseList" :key="index" class="topic-box"> -->
-                        <div v-for="(item, index) in exerciseList" :key="index" class="topic-box">
-                            <div style="width: 100%;">
-                                <span style="vertical-align: top; margin-right: 5px; cursor: pointer;" @click="onCollection">
-                                    <Icon custom="iconfont icon-shoucang1" size="19" color="#3B660C" v-show="!iscollection"></Icon>
-                                    <Icon custom="iconfont icon-shoucang2" size="19" color="#EA8F3E" v-show="iscollection"></Icon>
-                                </span>
-                                <span style="vertical-align: top;">{{ pageSize * (pageNum - 1) + index + 1 }}. </span>
-                                <div v-html="item.question" style="width: calc(99% - 40px); display: inline-block;"></div>
-                                <div class="answer-area">
-                                    <span class="answer-tip">【答案】</span>
-                                    <p>
-                                        这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟,如“安得广厦千万间,大庇天下寒士俱欢颜"这样的诗句,表现出作者在自己生活极度艰难的情景下,依然不忘忧国忧民,情真意切.感人至深。
-                                    </p>
-                                </div>
-                                <div class="answer-area">
-                                    <span class="answer-tip">【解析】</span>
-                                    <p>
-                                        这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
-                                    </p>
-                                </div>
-                                <!-- <div class="topic-type">
-                                    <span>
-                                        {{ $t('studentWeb.wrongTopic.type') }}:{{ typeObj[item.type] }}
-                                    </span>
-                                    <span>
-                                        {{ $t('studentWeb.wrongTopic.diff') }}:{{ diffList[item.level - 1] }}
-                                    </span>
-                                    <span>
-                                        {{ $t('studentWeb.wrongTopic.level') }}:{{ levelList[item.field] }}
-                                    </span>
-                                    <span>
-                                        {{ $t('studentWeb.wrongTopic.wrong') }}:15%
-                                    </span>
-                                    <span>
-                                        {{ $t('studentWeb.wrongTopic.wrongNum') }}:2
-                                    </span>
-                                </div> -->
-                                <div class="topic-type">
-                                    <span>
-                                        建议下次练习时间:2022-11-5
-                                    </span>
-                                    <span>
-                                        最近练习:2022-10-7
-                                    </span>
-                                    <span>
-                                        加入时间:2022-9-17
+            <!-- 题目列表 -->
+            <div class="topic-list">
+                <!-- <div style="overflow: hidden;">
+                    <Checkbox v-model="checkAll">{{ $t('studentWeb.wrongTopic.allTopic') }}</Checkbox>
+                    <span style="float: right">
+                        {{ $t('studentWeb.wrongTopic.check') }}:
+                        <span style="font-size: 18px; font-weight: bold;">{{ checkNum }}</span>
+                        <span :class="['start-btn-primary', {'start-btn': checkNum}]" @click="startPra">{{ $t('studentWeb.wrongTopic.startPractice') }}</span>
+                    </span>
+                </div> -->
+                <template v-if="exerciseList.length">
+                    <!-- <Scroll class="list-scroll"> -->
+                        <!-- <CheckboxGroup v-model="checkTopicArr"> -->
+                            <!-- <Checkbox :label="index" v-for="(item, index) in exerciseList" :key="index" class="topic-box"> -->
+                            <div v-for="(item, index) in exerciseList" :key="index" class="topic-box">
+                                <div style="width: 100%;">
+                                    <span style="vertical-align: top; margin-right: 5px; cursor: pointer;" @click="onCollection">
+                                        <Icon custom="iconfont icon-shoucang1" size="19" color="#3B660C" v-show="!iscollection"></Icon>
+                                        <Icon custom="iconfont icon-shoucang2" size="19" color="#EA8F3E" v-show="iscollection"></Icon>
                                     </span>
+                                    <span style="vertical-align: top;">{{ pageSize * (pageNum - 1) + index + 1 }}. </span>
+                                    <div v-html="item.question" style="width: calc(99% - 40px); display: inline-block;"></div>
+                                    <div class="answer-area">
+                                        <span class="answer-tip">【答案】</span>
+                                        <p>
+                                            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟,如“安得广厦千万间,大庇天下寒士俱欢颜"这样的诗句,表现出作者在自己生活极度艰难的情景下,依然不忘忧国忧民,情真意切.感人至深。
+                                        </p>
+                                    </div>
+                                    <div class="answer-area">
+                                        <span class="answer-tip">【解析】</span>
+                                        <p>
+                                            这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。这首诗之所以震撼人心,最重要的原因是诗人忘我的精神、博大的胸襟。
+                                        </p>
+                                    </div>
+                                    <!-- <div class="topic-type">
+                                        <span>
+                                            {{ $t('studentWeb.wrongTopic.type') }}:{{ typeObj[item.type] }}
+                                        </span>
+                                        <span>
+                                            {{ $t('studentWeb.wrongTopic.diff') }}:{{ diffList[item.level - 1] }}
+                                        </span>
+                                        <span>
+                                            {{ $t('studentWeb.wrongTopic.level') }}:{{ levelList[item.field] }}
+                                        </span>
+                                        <span>
+                                            {{ $t('studentWeb.wrongTopic.wrong') }}:15%
+                                        </span>
+                                        <span>
+                                            {{ $t('studentWeb.wrongTopic.wrongNum') }}:2
+                                        </span>
+                                    </div> -->
+                                    <div class="topic-type">
+                                        <span>
+                                            建议下次练习时间:2022-11-5
+                                        </span>
+                                        <span>
+                                            最近练习:2022-10-7
+                                        </span>
+                                        <span>
+                                            加入时间:2022-9-17
+                                        </span>
+                                    </div>
                                 </div>
                             </div>
-                        </div>
-                    <!-- </CheckboxGroup> -->
-                <!-- </Scroll> -->
-            </template>
-            <Page :total="topicTotal" show-sizer show-total :page-size="pageSize" @on-page-size-change="pageSizeChange"
-		            :current="pageNum" @on-change="pageChange" :page-size-opts="[5, 10, 15, 20]"
-                    style="text-align: center; margin-top: 20px;" />
-        </div>
-    </Scroll>
+                        <!-- </CheckboxGroup> -->
+                    <!-- </Scroll> -->
+                </template>
+                <Page :total="topicTotal" show-sizer show-total :page-size="pageSize" @on-page-size-change="pageSizeChange"
+                        :current="pageNum" @on-change="pageChange" :page-size-opts="[5, 10, 15, 20]"
+                        style="text-align: center; margin-top: 20px;" />
+            </div>
+        </Scroll>
         <Modal v-model="pointShow" :title="$t('studentWeb.wrongTopic.checkPoint')" @on-ok="okPoint" class="wrong-ques-modal">
             <p>
                 <!-- <span style="margin-left: 50px;">学段:初中</span> -->
@@ -166,6 +173,7 @@ export default {
         return {
             MyNo: "8",
             MyName: "",
+            isLoading: false,
             animal: "",
             filtSubject: 0,
             filtType: 0,
@@ -257,6 +265,7 @@ export default {
         },
         // 获取题目
         getTopicList() {
+            this.isLoading = true
             var queryData = {
                 "@DESC": "createTime",
                 "code": "hbcn",
@@ -276,6 +285,7 @@ export default {
                     this.topicList = this.topicRes
                     this.topicTotal = this.topicList.length
                     this.pageChange(1)
+                    this.isLoading = false
                 }
             }).catch((e) => {
             });
@@ -366,6 +376,10 @@ export default {
             this.winHeight = e.target.scrollTop || document.documentElement.scrollTop
             this.isOpen = false
         },
+        //退出测试
+        quitTest() {
+            this.$router.go(-1)
+        },
     },
     computed: {
         checkNum() {

+ 10 - 2
TEAMModelOS/ClientApp/src/components/student-web/WrongQusetion/WrongQues.vue

@@ -64,6 +64,8 @@ import { mapState } from 'vuex'
 export default {
     data () {
         return {
+            MyNo: "8", //接收NavBar 選定的那一頁icon標示
+            MyName: "",
             isReview: false,
             filtType: {
                 term: 0,
@@ -108,6 +110,11 @@ export default {
             userInfo: state => state.userInfo,
         })
     },
+    created () {
+        this.MyName = this.$t('studentWeb.type.wrongTopic');
+        this.$emit("onNavNo", this.MyNo);
+        this.$emit("onNavName", this.MyName);
+    },
     mounted () {
         this.setMap()
     },
@@ -176,8 +183,9 @@ export default {
 
             this.$router.push({
                 name: "answer",
-                param: {
-                    qsList: record
+                params: {
+                    qsList: record,
+                    mode: 'wrong'
                 },
             })
         },

+ 37 - 36
TEAMModelOS/ClientApp/src/view/classrecord/ClassRecord.vue

@@ -72,7 +72,7 @@
                     <span class="static-label">测验总数</span>
                   </div>
                 </div>
-                <BaseReportPie v-if="recordInfo" :lessonInfo="recordInfo"></BaseReportPie>
+                <BaseReportRadar v-if="recordInfo" :lessonInfo="recordInfo"></BaseReportRadar>
               </div>
               <!-- 国际站显示统计数据 -->
               <DataCount :rcdInfo="recordInfo" v-if="isGlobalSite"></DataCount>
@@ -241,6 +241,7 @@
 </template>
 <script>
 import BaseReportPie from '@/view/research-center/BaseReportPie.vue'
+import BaseReportRadar from '@/view/research-center/BaseReportRadar.vue'
 import WrkCmp from './eventchart/WrkCmp.vue'
 import PopQues from './eventchart/PopQues.vue'
 import Buzr from './eventchart/Buzr.vue'
@@ -255,42 +256,42 @@ import FileSaver from "file-saver";
 import JSZip from "jszip";
 export default {
   components: {
-    PopQues, Pick, Push, Receive, DataCount, CountTo, Buzr, Exam, WrkCmp, BaseReportPie
+    PopQues, Pick, Push, Receive, DataCount, CountTo, Buzr, Exam, WrkCmp, BaseReportPie, BaseReportRadar
   },
   data() {
     return {
       filterType: 'all',
       reportModal: false,
-        filterInte: [
-            {
-                value: 'all',
-                text: this.$t('cusMgt.rcd.filter1'),
-            },
-            {
-                value: 'Push',
-                text: this.$t('cusMgt.rcd.filter2'),
-                events: ['FastPgPush'],
-                count: 0
-            },
-            {
-                value: 'Task',
-                text: this.$t('cusMgt.rcd.filter3'),
-                events: ['WrkSpaceLoad', 'WrkCmp'],
-                count: 0
-            },
-            {
-                value: 'Interactive',
-                text: this.$t('cusMgt.rcd.filter4'),
-                events: ['PopQuesLoad', 'ReAtmpAnsStrt', 'BuzrLoad'],
-                count: 0
-            },
-            {
-                value: 'SPQStrt',
-                text: this.$t('cusMgt.rcd.filter5'),
-                events: ['SPQStrt'],
-                count: 0
-            }
-        ],
+      filterInte: [
+        {
+          value: 'all',
+          text: this.$t('cusMgt.rcd.filter1'),
+        },
+        {
+          value: 'Push',
+          text: this.$t('cusMgt.rcd.filter2'),
+          events: ['FastPgPush'],
+          count: 0
+        },
+        {
+          value: 'Task',
+          text: this.$t('cusMgt.rcd.filter3'),
+          events: ['WrkSpaceLoad', 'WrkCmp'],
+          count: 0
+        },
+        {
+          value: 'Interactive',
+          text: this.$t('cusMgt.rcd.filter4'),
+          events: ['PopQuesLoad', 'ReAtmpAnsStrt', 'BuzrLoad'],
+          count: 0
+        },
+        {
+          value: 'SPQStrt',
+          text: this.$t('cusMgt.rcd.filter5'),
+          events: ['SPQStrt'],
+          count: 0
+        }
+      ],
       split1: 0.4,
       backPage: undefined,
       baseData: {}, //base.json
@@ -707,7 +708,7 @@ export default {
               //} else {
               //  return event.Event == this.filterType
               //}
-                return filterInfo.events?.includes(event.Event)
+              return filterInfo.events?.includes(event.Event)
             })
 
           }
@@ -760,9 +761,9 @@ export default {
   created() {
     this.hiTeachEvent = this.$GLOBAL.HI_TEACH_EVENT()
     //正式站先暂时不放出课中评测
-     if (this.$store.state.config.srvAdrType == 'product') {
-         this.$delete(this.hiTeachEvent, 'SPQStrt')
-     }
+    if (this.$store.state.config.srvAdrType == 'product') {
+      this.$delete(this.hiTeachEvent, 'SPQStrt')
+    }
     this.events = Object.keys(this.hiTeachEvent)
     this.fnEvents = this.events.filter(key => this.hiTeachEvent[key].type === 'fn')
     console.log(this.events, this.fnEvents)

+ 13 - 5
TEAMModelOS/ClientApp/src/view/dashboard/Art.vue

@@ -112,9 +112,9 @@ export default {
     RightTop,
   },
   mounted() {
-    setTimeout(() => {
-      this.$tools.fullScreen(document.getElementById('artIndex'))
-    }, 600)
+    // setTimeout(() => {
+    //   this.$tools.fullScreen(document.getElementById('artIndex'))
+    // }, 600)
     this.timeFn()
   },
   beforeDestroy() {
@@ -194,12 +194,20 @@ export default {
         (res) => {
           this.acList = res.arts.filter(i => i.progress === 'finish')
           if (this.acList.length) {
+            this.$tools.fullScreen(document.getElementById('artIndex'))
             this.onAcChange(0)
           } else {
-            this.$Message.warning('未查询到已结束的艺术评测活动!')
             setTimeout(() => {
-              this.$router.go(-1)
+              this.$Modal.confirm({
+                title: '温馨提示',
+                content: '<p>未查询到已结束的艺术评测活动!</p>',
+                cancelText: '',
+                onOk: () => {
+                  this.$router.go(-1)
+                }
+              });
             }, 1000)
+            // this.cancelLoading()
           }
         },
         (err) => { }

+ 12 - 1
TEAMModelOS/ClientApp/src/view/dashboard/fiveEdu/FiveEdu.less

@@ -148,9 +148,20 @@
 
         .stu-search-wrap {
             position: absolute;
-            right: 10px;
+            right: 80px;
             top: 10px;
 
+            .ivu-select-input {
+                height: 26px;
+                line-height: 26px;
+            }
+
+            .ivu-select-selection {
+                height: 26px;
+                border-color: #5263af;
+                transform: skewX(-20deg);
+            }
+
             .ivu-select-selected-value {
                 font-size: 14px !important;
                 color: #fff;

+ 10 - 6
TEAMModelOS/ClientApp/src/view/dashboard/fiveEdu/FiveEdu.vue

@@ -79,11 +79,7 @@
                 <div class="bottom">
                   <dv-border-box-13>
                     <div class="dashboard-block">
-                      <div class="stu-search-wrap" v-if="inClassView">
-                        <Select filterable v-model="curStuIndex" style="width:250px">
-                          <Option v-for="(item,index) in stuList" :value="index" :key="item.id">{{ item.name }}({{ item.id }})</Option>
-                        </Select>
-                      </div>
+
                       <div class="block-title">
                         <span>学生德育风采</span>
                         <dv-decoration-1 style="width:150px;height:20px;" />
@@ -120,10 +116,15 @@
                     <div class="dashboard-block">
                       <div class="block-title">
                         <span>个人综合排名</span>
-                        <dv-decoration-1 style="width:150px;height:20px;" />
+                        <dv-decoration-1 style="width:150px;height:20px;" v-if="!inClassView" />
                         <BasePaging></BasePaging>
                       </div>
                       <div class="block-content">
+                        <div class="stu-search-wrap" v-if="inClassView">
+                          <Select filterable v-model="curStuIndex" style="width:200px" @on-change="onStuSelect">
+                            <Option v-for="(item,index) in stuList" :value="index" :key="item.id">{{ item.name }}({{ item.id }})</Option>
+                          </Select>
+                        </div>
                         <!-- <dv-scroll-board :config="gradeRankConfig" /> -->
                         <div class="honor-avatar">
                           <div class="honor-item" v-for="(item,index) in stuTopArr" :key="index">
@@ -409,6 +410,9 @@ export default {
     this.findTargets()
   },
   methods: {
+    onStuSelect() {
+      this.goStudent()
+    },
     onMenuClick(menu) {
       switch (menu.id) {
         case 'all':

+ 9 - 1
TEAMModelOS/ClientApp/src/view/elegant/Elegant.vue

@@ -25,7 +25,7 @@
         </TimelineItem>
       </Timeline>
     </div>
-    <Drawer :title="isEdit ? '编辑素材' : '添加素材'" :closable="false" v-model="editModal" width="520" :transfer="false">
+    <Drawer :title="isEdit ? '编辑素材' : '添加素材'" :closable="false" v-model="editModal" width="520" :transfer="false" @on-visible-change="onDrawerChange">
       <Form :model="curElegantItem" label-position="top" v-if="curElegantItem">
         <FormItem :label="`活动名称`">
           <Input v-model="curElegantItem.title" :placeholder="`请输入活动名称...`"></Input>
@@ -96,6 +96,14 @@ export default {
         attachments: []
       }
     },
+    onDrawerChange() {
+      this.curElegantItem = {
+        title: '',
+        content: '',
+        createTime: 0,
+        attachments: []
+      }
+    },
     onImgClick(imgList, index) {
       this.$hevueImgPreview({
         multiple: true,

+ 3 - 3
TEAMModelOS/ClientApp/src/view/student-web/AppNew.vue

@@ -90,14 +90,14 @@
                         <span class="no-show" v-show="MyNo != 3">{{ $t('studentWeb.type.activity') }}</span>
                     </MenuItem>
                     <!-- 错题本 -->
-                    <!-- <MenuItem name="8" to="/studentWeb/practice/wrongQues" :title="$t('studentWeb.type.wrongTopic')">
+                    <!-- <MenuItem name="8" to="/studentWeb/practice/wrongQues" :title="$t('studentWeb.type.wrongTopic')" v-show="selectClass">
                         <Icon custom="iconfont icon-cuotiji" size="17" class="tabIcon1" />
                         <span class="no-show" v-show="MyNo != 8">{{ $t('studentWeb.type.wrongTopic') }}</span>
                     </MenuItem> -->
                     <!-- 精准练习 -->
-                    <!-- <MenuItem name="12" to="/studentWeb/practice/preciseQues" title="精准练习">
+                    <!-- <MenuItem name="12" to="/studentWeb/practice/preciseQues" :title="$t('studentWeb.type.wrongTopic1')" v-show="selectClass && !onlySystem">
                         <Icon custom="iconfont icon-cuotiji" size="17" class="tabIcon1" />
-                        <span class="no-show" v-show="MyNo != 12">精准练习</span>
+                        <span class="no-show" v-show="MyNo != 12">{{ $t('studentWeb.type.wrongTopic1') }}</span>
                     </MenuItem> -->
                     <!-- 成绩 -->
                     <MenuItem name="7" to="/studentWeb/achievement" :title="$t('studentWeb.type.achievement')" v-show="selectClass">

+ 52 - 0
TEAMModelOS/Controllers/OpenApi/Business/BizOverallEducationController.cs

@@ -205,6 +205,58 @@ namespace TEAMModelOS.Controllers
                     lessonRecord.totalInteractPoint = lessonBase.summary.totalInteractPoint;
                     lessonRecord.learningCategory = lessonBase.summary.learningCategory;
                     lessonRecord.source = 1;
+
+                    //计算TP灯
+                    {
+                        int T = -1;
+                        int P = -1;
+                        if (lessonRecord.clientInteractionAverge <= 0)
+                        {
+                            T = 0;
+                        }
+                        else if (lessonRecord.clientInteractionAverge >= 1 && lessonRecord.clientInteractionAverge <= 2)
+                        {
+                            T = 1;
+                        }
+                        else
+                        {
+                            T = 2;
+                        }
+                        //if (lessonRecord.examCount > 0)
+                        //{
+                        //    //有评测次数大于0则P是直接绿灯
+                        //    P = 2;
+                        //}
+                        //else {
+
+                        //}
+
+                        int a = lessonRecord.hitaClientCmpCount;
+                        int b = lessonRecord.pushCount;
+                        int c = lessonRecord.examCount;
+                        switch (true)
+                        {
+                            case bool when T == 0:
+                                P = 0;
+                                break;
+                            case bool when T == 1 || T == 2:
+                                if (a == 0 && b == 0 && c == 0)
+                                {
+                                    P = 0;
+                                }
+                                else if ((a > 0 && b > 0) || (a > 0 && c > 0) || (b > 0 && c > 0))
+                                {
+                                    P = 2;
+                                }
+                                else
+                                {
+                                    P = 1;
+                                }
+                                break;
+                        }
+                        lessonRecord.tLevel = T;
+                        lessonRecord.pLevel = P;
+                    }
                 }
                 if (resLess.Status == 200)
                     lessonRecord = await cosmosClient.GetContainer(Constant.TEAMModelOS, "School").ReplaceItemAsync<LessonRecord>(lessonRecord, lessonRecord.id, new PartitionKey($"{code}"));