Browse Source

Merge branch 'develop5.0-tmd' into hhb/develop-notice

CrazyIter_Bin 4 years ago
parent
commit
00836bc669
36 changed files with 1092 additions and 241 deletions
  1. 13 7
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue
  2. 2 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue
  3. 33 10
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue
  4. 2 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BasePie.vue
  5. 17 10
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue
  6. 3 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseTestScatter.vue
  7. 0 6
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue
  8. 35 30
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  9. 0 0
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/remedyTest.less
  10. 558 0
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/remedyTest.vue
  11. 8 11
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue
  12. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  13. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  14. 7 0
      TEAMModelOS/ClientApp/src/store/module/totalAnalysis.js
  15. 1 0
      TEAMModelOS/ClientApp/src/utils/evTools.js
  16. 9 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  17. 1 0
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue
  18. 28 16
      TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue
  19. 1 2
      TEAMModelOS/ClientApp/src/view/learnactivity/ManualPaper.vue
  20. 3 2
      TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.vue
  21. 1 1
      TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue
  22. 180 0
      TEAMModelOS/ClientApp/src/view/settings/AppInfo.vue
  23. 96 77
      TEAMModelOS/ClientApp/src/view/settings/OpenMgmt.vue
  24. 23 17
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue
  25. 1 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  26. 2 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue
  27. 7 4
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  28. 3 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue
  29. 10 7
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  30. 3 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue
  31. 4 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  32. 16 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue
  33. 2 1
      TEAMModelOS/Controllers/Analysis/AchievementController.cs
  34. 17 9
      TEAMModelOS/Controllers/Common/ExamController.cs
  35. 1 1
      TEAMModelOS/Controllers/Common/VoteController.cs
  36. 1 1
      TEAMModelOS/TEAMModelOS.csproj

+ 13 - 7
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue

@@ -11,7 +11,8 @@
                 knowledgeData: [],
                 x: [],
                 y: [],
-                activeItemIndex: 0
+                activeItemIndex: 0,
+				curClassIndex:-1,
             }
         },
 
@@ -192,20 +193,20 @@
 				
             },
 
-            doRender(data,classIndex) {
-				console.log(...arguments)
+            doRender(data,classIndexs) {
+				let classIndex = this.getCurClassIndex
+				console.log(classIndex)
 				// 区分全部班级以及单个班级的数据
                 this.x = data.pointList
                 this.y = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
                 this.drawLine()
-				console.log(this.y)
             }
         },
 
         mounted() {
             if (this.getKnowledgeData) {
-				this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
-                this.doRender(this.getKnowledgeData,-1)
+				// this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
+                this.doRender(this.getKnowledgeData,this.curClassIndex)
             }
 			
 			this.$EventBus.$on('onCollapseChange',val => {
@@ -240,17 +241,22 @@
 			getAnalysisJson() {
 			    return this.$store.state.totalAnalysis.analysisJson
 			},
+			getCurClassIndex(){
+				return this.$store.state.totalAnalysis.curClassIndex
+			}
         },
 		
 		watch: {
 		    getKnowledgeData: {
 		        handler(val) {
 		            if (val) {
-		                this.doRender(val,-1)
+		                this.doRender(val,this.curClassIndex)
 		            }
 		        }
 		    },
 			classIndex(n,o){
+				console.log('柱状图变化了', n - 1)
+				this.curClassIndex = n - 1
 				this.doRender(this.getKnowledgeData,n - 1)
 			},
 		}

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeRadar.vue

@@ -160,8 +160,8 @@
 
     .myRadar {
         width: 100%;
-        height: 480px;
-        margin: 50px auto 0 auto;
+        height: 450px;
+        margin: 30px auto 0 auto;
         padding: 30px;
         display: block;
     }

+ 33 - 10
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue

@@ -158,7 +158,6 @@
 				console.log(val)
 				let filterKey = val.key
 				let filterValue = val._filterChecked.length ? val._filterChecked[0] : null
-
 				if (filterKey === 'className') {
 					this.originData = filterValue ? this.tableDatas.filter(item => item.className === filterValue) : this
 						.firstData
@@ -193,6 +192,8 @@
 				let end = this.pageSizes * page
 				this.currentPage = page
 				this.tableData = this.originData.slice(start, end)
+				console.log(this.tableColumns)
+				console.log(this.tableData)
 			},
 
 			// 页码操作
@@ -446,7 +447,15 @@
 			// 渲染百分比数据
 			renderPercent(h, params) {
 				return h('span', params.row.scoreRate + '%')
-			}
+			},
+			
+			renderCsRate(h, params) {
+				return h('span', params.row.csRate + '%')
+			},
+			
+			renderOverRate(h, params) {
+				return h('span', params.row.overAverageRate + '%')
+			},
 		},
 
 		mounted() {
@@ -464,21 +473,35 @@
 		},
 
 		watch: {
-			tableDatas: function(data) {
-				this.originData = JSON.parse(JSON.stringify(data))
-				if (this.isFirst) this.firstData = JSON.parse(JSON.stringify(data))
-				// 获取当前测评班级数据
-				this.subjectList = this.$store.state.totalAnalysis.subjectList
-				// this.subjectList = ['全部'].concat(this.$store.state.totalAnalysis.subjectList)
-				this.pageChange(1)
-				this.isFirst = false
+			tableDatas:{
+				handler(data,oldData){
+					this.originData = JSON.parse(JSON.stringify(data))
+					this.firstData = JSON.parse(JSON.stringify(data))
+					// if (this.isFirst) this.firstData = JSON.parse(JSON.stringify(data))
+					// 获取当前测评班级数据
+					this.subjectList = this.$store.state.totalAnalysis.subjectList
+					// this.subjectList = ['全部'].concat(this.$store.state.totalAnalysis.subjectList)
+					this.pageChange(1)
+					this.isFirst = false
+				},
 			},
 			columns:{
 				handler(n,o){
+					n.forEach(item => {
+						item.render = item.renderType ? (typeof item.renderType === 'function' ? item.renderType : this[item.renderType]) : undefined
+						item.filterRemote = function(value, row){
+						}
+					})
 					this.tableColumns = n
 				},
 				deep:true
 			},
+			tableName:{
+				handler(n,o){
+					console.log(n)
+				},
+				deep:true
+			},
 			exportTableRefs: {
 				handler(n) {
 					// 如果导出的表格包含当前表格 则直接运行下载

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BasePie.vue

@@ -31,7 +31,7 @@
                         name: that.$t('totalAnalysis.ka_title1'),
                         type: 'pie',
                         radius: [40, 150],
-                        center: ['45%', '60%'],
+                        center: ['45%', '50%'],
                         max: 100, // for funnel
                         sort: 'ascending', // for funnel
                         data: data
@@ -101,7 +101,7 @@
 
     .myPie {
         width: 100%;
-        height: 380px;
+        height: 450px;
         margin: 0 auto;
         display: block;
     }

+ 17 - 10
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue

@@ -10,6 +10,7 @@
         props: ['echartsId','classIndex'],
         data() {
             return {
+				curClassIndex:-1,
                 radarData: []
             }
         },
@@ -118,9 +119,8 @@
                 myRadar.setOption(option)
             },
 
-            doRender(data,classIndex) {
-				console.log(data)
-				console.log(classIndex)
+            doRender(data,classIndexs) {
+				let classIndex = this.getCurClassIndex
                 let indicator = []
 				let rateArr = classIndex === -1 ? data.stupercent.grade.map(item => (Number(item)).toFixed(2)) : data.pointList.map(pointName => data.classpercent[pointName][classIndex].toFixed(2))
 				// 获取最大值 +5 设置到雷达边界最大值
@@ -131,14 +131,13 @@
                         max: maxNum
                     })
                 })
-				console.log(maxNum)
-				console.log(rateArr)
                 this.drawLine(indicator, rateArr)
             }
         },
         mounted() {
             if (this.getKnowledgeData) {
-                this.doRender(this.getKnowledgeData, -1)
+				console.log(this)
+                this.doRender(this.getKnowledgeData, this.curClassIndex)
             }
         },
 
@@ -160,12 +159,20 @@
 					}
 				}
 				return curJson
-            }
+            },
+			getCurClassIndex(){
+				return this.$store.state.totalAnalysis.curClassIndex
+			}
         },
 		
-		classIndex(n,o){
-			console.log('radar',n)
-			this.doRender(this.getKnowledgeData,n - 1)
+		watch:{
+			classIndex(n,o){
+				console.log('雷达图变化了', n - 1)
+				this.curClassIndex = n - 1
+				this.doRender(this.getKnowledgeData,n - 1)
+			},
+			immediate:true,
+			deep:true
 		}
     }
 </script>

+ 3 - 2
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseTestScatter.vue

@@ -10,7 +10,8 @@
 			return {
 				originArr: [],
 				dataArr: [],
-				activeItemIndex: 0
+				activeItemIndex: 0,
+				exersicesType: this.$GLOBAL.EXERCISE_TYPES(),
 			}
 		},
 		created() {
@@ -42,7 +43,7 @@
 						formatter: function(params) {
 							const item = params
 							return `${_this.$t('totalAnalysis.ta_table_text1')}:${item.data[3]}
-                        <br/>${_this.$t('totalAnalysis.ta_table_text2')}:${item.data[2]}
+                        <br/>${_this.$t('totalAnalysis.ta_table_text2')}:${that.exersicesType[item.data[2]]}
                         <br/>${_this.$t('totalAnalysis.ta_chart_text2')}:${item.data[1]}%
                        `
 						}

+ 0 - 6
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/LessonTestReport.vue

@@ -483,14 +483,8 @@
                }
                this.paperData = [...paper]
                if (this.paperData.length) {
-                   console.log(this.examInfo)
-                   console.log(this.examInfo.stuAns[0])
                    this.ansData = await this.getItem(this.examInfo.stuAns[0])
                }
-               console.log('5456465456456')
-               console.log(this.paperData)
-               console.log(this.ansData)
-               console.log(this.examInfo)
             },
             closeDetail() {
                 this.closeAnsDetail = !this.closeAnsDetail;

+ 35 - 30
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -116,43 +116,48 @@
                     }
                     let isTest = 0
                     this.$api.studentWeb.FindStudentPaper(req).then(res => {
-                        this.stuData = res
-                        let resData = res
-                        for (let item of resData.papers) {
-                            if (item.scope) {
-                                this.paperData.push(item)
+                        console.log(res)
+                        if (res.papers.length) {
+                            this.stuData = res
+                            let resData = res
+                            for (let item of resData.papers) {
+                                if (item.scope) {
+                                    this.paperData.push(item)
+                                }
                             }
-                        }
-                        for (let i = 0; i < this.paperData.length; i++) {
-                            this.paperData[i].subject = resData.subjects[i]
-                            this.paperData[i].allClass = resData.claId
-                            if (resData.stuAns[i] == undefined) {
-                                this.paperData[i].stuAns = []
-                                this.paperData[i].stuScore = []
-                            } else {
-                                if (resData.mark[i] !== undefined) {
-                                    this.paperData[i].stuAns = [resData.mark[i]]
+                            for (let i = 0; i < this.paperData.length; i++) {
+                                this.paperData[i].subject = resData.subjects[i]
+                                this.paperData[i].allClass = resData.claId
+                                if (resData.stuAns[i] == undefined) {
+                                    this.paperData[i].stuAns = []
+                                    this.paperData[i].stuScore = []
                                 } else {
-                                    this.paperData[i].stuAns = resData.stuAns[i]
-                                }
-                                this.paperData[i].stuScore = resData.stuScore[i]
-                                if (resData.stuAns[i][0] !== undefined) {
-                                    let k = 0
-                                    for (let item of resData.stuScore[i]) {
-                                        if (item == -1) {   //有未打分
-                                            k++
-                                        }
+                                    if (resData.mark[i] !== "") {
+                                        this.paperData[i].stuAns = [resData.mark[i]]
+                                    } else {
+                                        this.paperData[i].stuAns = resData.stuAns[i]
                                     }
-                                    if (k == 0 && this.paperData[i].progress == 'finish') {
-                                        isTest++
+                                    this.paperData[i].stuScore = resData.stuScore[i]
+                                    if (resData.stuAns[i][0] !== undefined) {
+                                        let k = 0
+                                        for (let item of resData.stuScore[i]) {
+                                            if (item == -1) {   //有未打分
+                                                k++
+                                            }
+                                        }
+                                        if (k == 0 && this.paperData[i].progress == 'finish') {
+                                            isTest++
+                                        }
                                     }
                                 }
                             }
+                            if (isTest == this.paperData.length) {
+                                this.isTestOver = true
+                            }
+                            this.opentestWithSubject(this.paperData[0])
+                        } else {
+                            this.$Message.warning('试卷已删除!')
                         }
-                        if (isTest == this.paperData.length ) {
-                            this.isTestOver = true
-                        }
-                        this.opentestWithSubject(this.paperData[0])
                     })
                 }
                 this.isLoad = false

+ 0 - 0
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/remedyTest.less


+ 558 - 0
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/remedyTest.vue

@@ -0,0 +1,558 @@
+<template>
+    <div class="lesson-test-pop">
+        <loading :active.sync="isLoading"
+                 :is-full-page="fullPage"
+                 background-color="#000"
+                 :opacity="opacity">
+            <template slot="default">
+                <svg-icon icon-class="loader" class="loader-icon" />
+            </template>
+        </loading>
+        <div v-if="WarmMessageisOpen" class="warmMessage">
+            <div class="messageCard">
+                <!---中途離開測驗之提示框---->
+                <div class="messageCardContent1" v-if="showMessageNum == 1">
+                    <h3>{{$t("studentWeb.exam.testpop.exitQuizhint")}}</h3>
+                    <svg-icon icon-class="logoutComfirm" class="logoutComfirmIcon" />
+                    <br />
+                    <p v-show="closeTest">
+                        {{$t("studentWeb.exam.testpop.exitQuizhintDe")}}
+                        <br /> {{$t("studentWeb.exam.testpop.exitQuizhintDes")}}
+                    </p>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.cancel")}}</button>
+                    <button class="messageCardBtn" @click="quitTest()">{{$t("studentWeb.exam.testpop.ok")}}</button>
+                </div>
+                <!---每題都完成到最後一題交卷之提示框---->
+                <div class="messageCardContent2" v-if="showMessageNum == 2">
+                    <h3>{{$t("studentWeb.exam.testpop.submitQuizhint")}}</h3>
+                    <svg-icon icon-class="finshedTest" class="handOnImg" />
+                    <p>{{$t("studentWeb.exam.testpop.submitQuizhintDes1")}}</p>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.check")}}</button>
+                    <button class="messageCardBtn" @click="closetest()">{{$t("studentWeb.exam.testpop.okSubmit")}}</button>
+                </div>
+                <!---有題目沒完成就交卷之提示框---->
+                <div class="messageCardContent3" v-if="showMessageNum == 3">
+                    <h3>{{$t("studentWeb.exam.testpop.submitQuizhint")}}</h3>
+                    <svg-icon icon-class="unfinishedTest" class="handOnImg" />
+                    <p>
+                        {{$t("studentWeb.exam.testpop.conAnswer0")}}
+                        <span style="color:rgb(250, 100, 0);font-weight:900">{{ undo }}{{$t("studentWeb.exam.testpop.conAnswer1")}}</span>{{$t("studentWeb.exam.testpop.conAnswer2")}}
+                    </p>
+                    <button class="messageCardBtn" @click="closeWarmMessage()">{{$t("studentWeb.exam.testpop.conAnswer")}}</button>
+                    <button class="messageCardBtn" @click="closetest()">{{$t("studentWeb.exam.testpop.okSubmit")}}</button>
+                </div>
+            </div>
+        </div>
+
+        <div class="testTitle">
+            <span class="logoutIcon" @click="openWarmMessage(1)">
+                <svg-icon icon-class="logout" />
+            </span>
+            <span class="testTitleText">{{$t("studentWeb.home.exam")}}:{{ $store.getters.getItemTitle.name }}</span>
+            <div class="myProgressBar">
+                <span class="myTestProgresstitle">{{$t("studentWeb.exam.testpop.completion")}}</span>
+                <Progress style="margin-top:15px" :percent="completeRate" />
+            </div>
+            <button v-if="closeTest" class="submitBtn" @click="openWarmMessage(2)" :class="{ hintClick:hintHandon() }">{{$t("studentWeb.exam.testpop.submitted")}}</button>
+            <button v-if="!closeTest" class="submitBtn" :class="{ hintClick:hintHandon()  }">{{$t("studentWeb.exam.testpop.finish")}}</button>
+        </div>
+        <Row :gutter="30">
+            <i-col class="questionArea"
+                   :xs="24"
+                   :sm="24"
+                   :md="12"
+                   :lg="20">
+                <div class="questionContent" ref="questionBox">
+                    <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>
+                        </div>
+                        <div class="que-item" v-if="getQue(queNo).type != 'compose' && getQue(queNo).parent == undefined">
+                            <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>
+                                </div>
+                                <div class="compose-box">
+                                    <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:40px">{{ getQue(queNo).paperIndex}}:</span>
+                                    <!--题目渲染-->
+                                    <div class="que-items" id="answer-box" v-html="getQue(queNo).question"></div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="answers">
+                        <div class="questionNo">{{$t("studentWeb.exam.testpop.myAns")}}</div>
+                        <div class="answers-box">
+                            <!--问答题-->
+                            <div class="compose-content" v-if="getQue(queNo).type != 'judge' && getQue(queNo).type != 'single'  && getQue(queNo).type != 'multiple'">
+                                <Compose ref="compose" :itemInfo="getQue(queNo)" :close="!closeTest" :textData="checkers[queNo]" :index="queNo" @dataGet="getComposeAns"></Compose>
+                            </div>
+                            <!--判断题选项-->
+                            <div v-if="getQue(queNo).type == 'judge'" align="center">
+                                <label class="testBtn yesNoBtn">
+                                    <input type="radio" value="A" v-model="checkers[queNo][0]" :disabled="!closeTest" />
+                                    <div class="testbg">
+                                        <Icon type="ios-radio-button-off" />
+                                    </div>
+                                </label>
+                                <label class="testBtn yesNoBtn">
+                                    <input type="radio" value="B" v-model="checkers[queNo][0]" :disabled="!closeTest" />
+                                    <div class="testbg">
+                                        <Icon type="md-close" />
+                                    </div>
+                                </label>
+                            </div>
+                            <!--选择题选项-->
+                            <div class="select-box" v-if="getQue(queNo).type != 'judge'">
+                                <label class="testBtn"
+                                       v-for="(item, index) in getQue(queNo).option"
+                                       :key="index">
+                                    <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="showImg($event)"></div>
+                                        </div>
+                                        <div style="clear:both"></div>
+                                    </div>
+                                </label>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </i-col>
+            <!--答题卡-->
+            <i-col class="ansArea"
+                   :xs="12"
+                   :sm="12"
+                   :md="6"
+                   :lg="4">
+                <div class="checkAnswer">
+                    <span style="margin-top:10px;font-weight:800">{{$t("studentWeb.exam.testpop.myAnswerSheet")}}</span>
+                    <br />
+                    <br />
+                    <span style="margin-top:10px;font-weight:800">{{$t("studentWeb.exam.testpop.qNo")}}</span>
+                    <div class="que-box">
+                        <div v-for="(item,index) in examInfo" :class="[checkers[index].length > 0 ? 'has-ans':'ans-box',index == queNo ?'select-item':'']" @click="gototheQues(index +1)">
+                            <span style="padding:5px 5px;cursor:pointer"> {{ item.parent == undefined ? index +1 : item.paperIndex }}</span>
+                        </div>
+                    </div>
+                </div>
+                <!--切換頁-->
+                <div class="pageCtl2">
+                    <button @click="preQ()" v-show="queNo != 0">
+                        <Icon type="ios-arrow-back" />{{$t("studentWeb.exam.testpop.previous")}}
+                    </button>
+                    <button @click="nextQ()"
+                            v-show="queNo != (examInfo.length-1)"
+                            :class="{ hintClick:queNo != (examInfo.length-1) && checkers[queNo] != ''}">
+                        {{$t("studentWeb.exam.testpop.next")}}
+                        <Icon type="ios-arrow-forward" />
+                    </button>
+                </div>
+            </i-col>
+        </Row>
+        <!--图片放大显示-->
+        <div class="imgDolg"
+             v-show="imgPreview.show"
+             @click.stop="imgPreview.show = false">
+            <i class="el-icon-close"
+               id="imgDolgClose"
+               @click.stop="imgPreview.show = false"></i>
+            <img @click.stop="imgPreview.show = true" :src="imgPreview.img" />
+        </div>
+    </div>
+</template>
+
+<script>
+    import Loading from "vue-loading-overlay";
+    import "vue-loading-overlay/dist/vue-loading.css";
+    import Compose from './composePaper.vue'
+    import Complete from './completePaper.vue'
+    export default {
+        name: "LessonTestPop",
+        components: {
+            Loading,
+            Compose,
+            Complete
+        },
+        created() {
+            this.WarmMessageisOpen = false;
+            this.showMessageNum = 0;
+        },
+        mounted() {
+            this.formPaper()
+            this.getPaper()
+        },
+        props: {
+            papers: {
+                type: Object,
+                default:()=> {
+                    return {}
+                }
+            }
+        },
+        data() {
+            return {
+                isLoading: false,
+                fullPage: true,
+                opacity: 0.6,
+                showMessageNum: 0,
+                WarmMessageisOpen: false,
+                checkers: [],
+                queNo: 0,
+                undo: 0,
+                closeTest: true,
+                paperData: {},
+                testType: [
+                    {
+                        label: this.$t('studentWeb.exam.queType.single'),
+                        value: "single"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.multiply'),
+                        value: "multiple"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.judge'),
+                        value: "judge"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.complete'),
+                        value: "complete"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.subjective'),
+                        value: "subjective"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.compose'),
+                        value: "compose"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.correct'),
+                        value: "correct"
+                    },
+                    {
+                        label: this.$t('studentWeb.exam.queType.connector'),
+                        value: "connector"
+                    },
+                ],
+                examInfo: [],
+                judgeSelect: "",
+                imgPreview: {
+                    img: "",
+                    show: false
+                }
+            };
+        },
+        methods: {
+            //初始化試卷信息
+            formPaper() {
+                let paper = []
+                this.examInfo.length = []
+                let data = this.$store.getters.getPaperInfo.item
+                let exam = [...data]
+                this.$store.getters.getPaperInfo.item
+                if (this.$store.getters.getPaperInfo.item.length) {
+                        for (let i = 0; i < exam.length; i++) {
+                            if (exam[i].type == 'compose') {
+                                let k = 1
+                                if (exam[i].children.length > 0) {
+                                    for (let items of exam[i].children) {
+                                        items.parentInfo = exam[i]
+                                        items.parent = i
+                                        items.paperIndex = (i + 1) + '-' + k
+                                        paper.push(items)
+                                        k++
+                                    }
+                                }
+                            } else {
+                                exam[i].paperIndex = i
+                                paper.push(exam[i])
+                            }
+                    }
+                    }
+                this.examInfo = [...paper]
+            },
+            //獲取富文本返回數據
+            getComposeAns(data, index) {
+                if (index !== undefined) {
+                    this.checkers[index] = []
+                    if (data !== "") {
+                        this.checkers[index].push(data)
+                    }
+                    this.hintHandon()
+                }
+            },
+            getJudge() {
+                this.checkers[this.queNo] = []
+                this.checkers[this.queNo].push(this.judgeSelect)
+            },
+            getPaper() {
+                let paper = this.$store.getters.getCurrentSubject
+                this.paperData = { ...paper }
+            },
+            getTestType(data) {
+                for (let item of this.testType) {
+                    if (item.value == data) {
+                        return item.label
+                    }
+                }
+            },
+            getQue(index) {
+                if (this.examInfo.length) {
+                    if (this.examInfo[index]) {
+                        return this.examInfo[index];
+                    } else {
+                        return {
+                            type: ''
+                        }
+                    }
+                }
+            },
+            getAns(data, index) {
+                if (this.getQue(this.queNo).type == "single") {
+                    this.checkers[data].length = 0
+                    this.checkers[data].push(this.getQue(this.queNo).option[index].code)
+                }
+            },
+            //显示知识点(暂未对接)
+            hintHandon() {
+                let undoQuestion = 0
+                for (var i = 0; i <= this.examInfo.length - 1; i++) {
+                    if (this.checkers[i] == "") {
+                        undoQuestion++
+                    }
+                }
+                this.undo = undoQuestion
+                if (undoQuestion != 0) return false
+                else return true
+            },
+            gototheQues(index) {
+                this.queNo = index - 1
+            },
+            preQ() {
+                if (this.queNo > 0) this.queNo--
+            },
+            nextQ() {
+                if (this.queNo < (this.examInfo.length - 1)) this.queNo++
+            },
+            //打开提示信息
+            openWarmMessage(showMessageNum) {
+                this.WarmMessageisOpen = true
+                if (showMessageNum == 1) {
+                    this.showMessageNum = showMessageNum
+                } else if (showMessageNum == 2) {
+                    for (var i = 0; i <= this.examInfo.length; i++) {
+                        if (this.checkers[i] == "" && this.getQue(i).type != 'compose') {
+                            this.showMessageNum = 3
+                            break;
+                        }
+                        if (this.checkers[i] != "") {
+                            this.showMessageNum = 2
+                        }
+                    }
+                } else return;
+            },
+            //关闭提示信息
+            closeWarmMessage() {
+                this.WarmMessageisOpen = false
+            },
+            //提交作答记录
+            closetest() {
+                this.WarmMessageisOpen = false
+                if (this.checkers.length) {
+                    this.isLoading = true;
+                    let codes = this.$store.getters.getItemTitle.code.split('-')
+                    let req = {
+                        id: this.$store.getters.getItemTitle.id,
+                        answer: this.checkers,
+                        studentId: this.$store.state.userInfo.sub,
+                        classId: this.$store.getters.getExamInfo.allClass,
+                        subjectId: this.$store.getters.getExamInfo.subject.id,
+                        multipleRule: this.$store.getters.getExamInfo.multipleRule,
+                        paperId: this.$store.getters.getPaperInfo.id,
+                        code: codes[1],
+                        scode: this.$store.getters.getItemTitle.scode
+                    }
+                    this.$api.studentWeb.SaveStuExamPaper(req).then(res => {
+                        if (res) {
+                            this.$Message.success(this.$t('studentWeb.exam.submitSuccess'))
+                            setTimeout(() => {
+                                this.$store.commit("ToggleLessonTestPopWithSubject", "")
+                                this.isLoading = false
+                            }, 2000)
+                        }
+                    }, err => {
+                            this.$Message.warning(this.$t('studentWeb.exam.submitFail'))
+                        setTimeout(() => {
+                            this.isLoading = false
+                        }, 1000)
+                    })
+                }
+            },
+            //退出测试
+            quitTest() {
+                this.isLoading = true
+                setTimeout(() => {
+                    this.$store.commit("ToggleLessonTestPopWithSubject", "")
+                    this.isLoading = false
+                }, 500)
+            },
+            async getItem(data) {
+                let datas = []
+                if (data !== undefined) {
+                    let key = this.$store.getters.getExamInfo.code.split('-')
+                    let code = {
+                        scope: this.$store.getters.getExamInfo.scope,
+                        code: key[(key.length - 1)],
+                        blob: data
+                    }
+                    datas = await this.$evTools.getComposeItem(code)
+                    return datas
+                } else {
+                    return []
+                }
+            },
+            //放大图片
+            showImg(e) {
+                this.imgPreview = {
+                    img: "",
+                    show: false
+                }
+                if (e.target.tagName == 'IMG') {
+                    this.imgPreview.img = e.target.src
+                    this.imgPreview.show = true
+                }
+            },
+        },
+
+        watch: {
+            papers: {
+               async handler(newV, oldV) {
+                    if (newV.item.length) {
+                        this.checkers.length = 0
+                        this.closeTest = true
+                        if (this.$store.getters.getCurrentSubject.stuAns[0] !== undefined) {
+                            let data = []
+                            data = await this.getItem(this.$store.getters.getCurrentSubject.stuAns[0])
+                            if (data.length) {
+                                this.checkers = [...data]
+                            } else this.$Message.warning(this.$t('studentWeb.exam.msgWarning'))
+                            this.closeTest = false
+                            } else {
+                            for (let i = 0; i < this.$store.getters.getCurrentSubject.stuScore.length; i++) {
+                                    this.checkers == this.checkers.push([])
+                                }
+                        }
+                    }
+                },
+                deep: true,
+                immediate: true
+            }
+        },
+        computed: {
+            completeRate() {
+                if (this.examInfo.length) {
+                    let data = 0
+                    data = Math.ceil(((this.examInfo.length - this.undo) / this.examInfo.length) * 100)
+                    return data
+                } else {
+                    return 0
+                }
+
+            }
+        }
+    }
+</script>
+
+<style scoped>
+    @import "~@/assets/student-web/component_styles/paper-test.css";
+
+    .que-item /deep/ table {
+        border-top: 1px solid #ccc;
+        border-left: 1px solid #ccc;
+    }
+
+        .que-item /deep/ table td, table th {
+            border-right: 1px solid #ccc;
+            padding: 3px 5px;
+        }
+
+        .que-item /deep/ table th {
+            border-bottom: 1px solid #ccc;
+            border-right: 1px solid #ccc;
+            text-align: center;
+        }
+
+    .que-items /deep/ table {
+        border-top: 1px solid #ccc;
+        border-left: 1px solid #ccc;
+    }
+
+        .que-items /deep/ table td, table th {
+            border-right: 1px solid #ccc;
+            padding: 3px 5px;
+        }
+
+        .que-items /deep/ table th {
+            border-bottom: 1px solid #ccc;
+            border-right: 1px solid #ccc;
+            text-align: center;
+        }
+
+    .imgDolg {
+        width: 100vw;
+        height: 100vh;
+        position: fixed;
+        z-index: 9999;
+        background-color: rgba(140, 134, 134, 0.6);
+        top: 0;
+        left: 0;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+    }
+
+        .imgDolg img {
+            width: 60%;
+            border: 1px solid #eee;
+            height: 95%;
+        }
+
+        .imgDolg #imgDolgClose {
+            position: fixed;
+            top: 35px;
+            cursor: pointer;
+            right: 17%;
+            font-size: 50px;
+            color: white;
+        }
+</style>

+ 8 - 11
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventList.vue

@@ -120,8 +120,8 @@
     import PreviewProgressPie from "../EventView/PreviewProgressPie";
     export default {
         name: "EventList",
-        mounted() {
-            this.getPaper()
+        mounted() { 
+            this.getActivityInfo()
             this.selectedCondition(this.$store.getters.getItemTitle);
             if (this.$store.getters.getIsSelectedNow == false) {
                 this.predealMockdatafirstItem();
@@ -137,7 +137,7 @@
                 havejustfinishedItem: false, //無剛完成的數據情況,清單項目變動將會影響空白狀態之呈現
                 typeNametoIcon: [
                     {
-                        eventType: "Hreview",
+                        eventType: "Preview",
                         iconClass: "selflearninginTime",
                     },
                     {
@@ -203,14 +203,10 @@
             },
         },
         methods: {
-            //获取评测信息
-            getPaper() {
+            //获取活动信息数据
+            getActivityInfo() {
                 this.eventList.length = 0
                 this.isListNoItem = true;
-                this.getActivityInfo()
-            },
-            //***临时获取投票数据
-            getActivityInfo() {
                 if (this.$store.state.user.studentProfile.classinfo.id !== "") {
                     let classInfo = [this.$store.state.user.studentProfile.classinfo.id]
                     if (this.$store.state.user.studentProfile.courses.length) {
@@ -228,9 +224,11 @@
                             let data = []
                             for (let item of res.datas) {
                                 item.eventType = item.type
+                                item.progress = this.timeStatus(item)
+                                console.log(item)
                                 data.push(item)
                             }
-                            this.eventList = [...this.eventList, ...data]
+                            this.eventList = [...data]
                             this.eventList = this.eventList.sort(function (a, b) {
                                 return b.startTime - a.startTime //时间正序
                             });
@@ -279,7 +277,6 @@
                 return { x: x, y: y };
             },
             timeStatus(data) {
-                console.log(data)
                 let date = (new Date()).getTime() //当前时间
                 if (date >= data.endTime) {
                     return 'finish'

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -93,8 +93,9 @@ export default {
     ach_title1: '得分率统计',
     ach_title2: '平均分数统计',
     ach_title3: '进线人数统计',
-    ach_title4: '进线情况统计',
+    ach_title4: '学生表现统计',
     ach_title5: '各班平均与进线率统计',
+    ach_title5_2: '各班平均统计',
     ach_title6: '预警统计',
     ach_title7: '排名统计',
     ach_title8: '均分分析',

+ 2 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -93,8 +93,9 @@ export default {
 	ach_title1: '得分率統計',
 	ach_title2: '平均分數統計',
 	ach_title3: '進線人數統計',
-	ach_title4: '進線情况統計',
+	ach_title4: '學生表現統計',
 	ach_title5: '各班平均與進線率統計',
+	ach_title5_2: '各班平均統計',
 	ach_title6: '預警統計',
 	ach_title7: '排名統計',
 	ach_title8: '均分分析',

+ 7 - 0
TEAMModelOS/ClientApp/src/store/module/totalAnalysis.js

@@ -24,6 +24,8 @@ export default {
         knowledgeData: null,
         levelData: null,
         examPaper: null,
+		
+		curClassIndex:-1,
 
         exportTableData: null,
         exportTableRefs:null,
@@ -139,6 +141,11 @@ export default {
         updateExamPaper(state, val) {
             state.examPaper = val
         },
+		
+		// 更新试卷数据
+		updateClassIndex(state, val) {
+		    state.curClassIndex = val - 1
+		},
 
         // 更新科目列表
         updateSubjectList(state, val) {

+ 1 - 0
TEAMModelOS/ClientApp/src/utils/evTools.js

@@ -444,6 +444,7 @@ export default {
 	},
 	/* 获取完整的试卷数据 */
 	getComposeItem(paper) {
+		console.log(paper)
 		return new Promise(async (r, j) => {
 			// 根据试卷的Blob地址 去读取JSON文件
 			let sasString = paper.scope === 'school' ? await $tools.getSchoolSas(paper.code) : await $tools.getPrivateSas(paper.code)

+ 9 - 1
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -64,6 +64,13 @@
 							</div>
 						</div>
 					</div>
+					<!-- 认知层次部分 -->
+					<div class="item-explain">
+						<span class="explain-title" :style="{ color:isShowAnalysis ? '#099209' : '#10abe7' }">【{{$t('evaluation.field')}}】</span>
+						<div class="item-explain-details">
+							<span>{{ exersicesField[item.field - 1] }}</span>
+						</div>
+					</div>
 					<div class="item-explain" v-if="isShowAnalysis">
 						<span class="explain-title">【{{ $t('totalAnalysis.showAnalysis') }}】</span>
 						<div class="item-explain-details">
@@ -130,7 +137,8 @@
 		data() {
 			return {
 				collapseList:[],
-				surPlusScore: 0
+				surPlusScore: 0,
+				exersicesField: this.$GLOBAL.EXERCISE_LEVELS(),
 			}
 		},
 		created() {

+ 1 - 0
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseDiffPie.vue

@@ -40,6 +40,7 @@
 						}
 					},
                     color: ['#8378ea', '#e7bcf3', '#9fe6b8', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378ea'],
+                    // color: new Array(10).fill("#"+Math.random().toString(16).slice(-6)),
                     tooltip: {
                         trigger: 'item',
                         formatter: '{a} <br/>{b} : {c} ({d}%)'

+ 28 - 16
TEAMModelOS/ClientApp/src/view/evaluation/components/BasePointPie.vue

@@ -13,6 +13,24 @@
 			}
 		},
 		methods: {
+			
+			getColorRandom(num){
+			    var colorarr = [];
+			    //构成颜色的字符元素
+			    var cArray=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"];
+			    for(var i=0;i<num;i++){
+			    	var color = "#";
+			    	for(var j=0;j<6;j++){
+			   	        var  cIndex = Math.round(Math.random()*15);
+			   	   	    color+=cArray[cIndex];
+			   	    }
+			    	colorarr[i] = color;
+			    }
+				console.log(colorarr)
+			    return colorarr;
+			},
+			
+
 
 			drawLine(data) {
 				let that = this
@@ -34,19 +52,13 @@
 						bottom: 0,
 						type: 'scroll',
 						formatter: function(name, val) {
-							if(data.length){
-								return name + ' (' + data.filter(i => i.name === name)[0].value + that.$t('unit.text10') + ')';
+							if (data.length) {
+								return name + ' (' + data.filter(i => i.name === name)[0].value + that.$t(
+									'unit.text10') + ')';
 							}
 						}
 					},
-					color: [
-						"#4ea397",
-						"#22c3aa",
-						"#7bd9a5",
-						"#d0648a",
-						"#f58db2",
-						"#f2b3c9"
-					],
+					color:that.getColorRandom(50),
 					tooltip: {
 						trigger: 'item',
 						formatter: '{a} <br/>{b} : {c} ({d}%)'
@@ -72,25 +84,25 @@
 			let arr = []
 			let tempArr = []
 			this.echartsData.item.forEach(i => {
-				if(i.type === 'compose' && i.children.length){
+				if (i.type === 'compose' && i.children.length) {
 					tempArr.push(...i.children)
-				}else{
+				} else {
 					tempArr.push(i)
 				}
 			})
 			let typeList = this._.groupBy(tempArr, 'knowledge')
 			for (let key in typeList) {
-				let newKey = key === 'undefined' || !key ?  this.$t('evaluation.noPoints') : key
+				let newKey = key === 'undefined' || !key ? this.$t('evaluation.noPoints') : key
 				let isExistIndex = arr.map(i => i.name).indexOf(newKey)
-				if(arr.length && isExistIndex > -1){
+				if (arr.length && isExistIndex > -1) {
 					arr[isExistIndex].value = arr[isExistIndex].value + typeList[key].length
-				}else{
+				} else {
 					arr.push({
 						value: typeList[key].length,
 						name: newKey
 					})
 				}
-				
+
 			}
 			this.drawLine(arr)
 		},

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

@@ -201,7 +201,7 @@ export default {
                 let params = {
                     '@DESC': 'createTime',
                     'code': this.scope,
-                    "scope": this.routeScope,
+                    "scope": scope,
                     //'gradeIds[*]': scope == 'school' ? this.gradeIds : [],
                     'gradeIds[*]': [],
                     'periodId': scope == 'school' ? this.searchPeriod : [],
@@ -283,7 +283,6 @@ export default {
         },
         source:{
             handler(n,o){
-                console.log(this.$route.name)
                 if(this.source){
                     this.scope = this.source
                 }else{

+ 3 - 2
TEAMModelOS/ClientApp/src/view/learnactivity/MgtSchoolEva.vue

@@ -69,14 +69,15 @@
                     <span v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].source == '2'" :class="curBarIndex == 3 ? 'evalustion-bar-item line-bottom-active line-bottom':'evalustion-bar-item line-bottom'" @click="selectBar(3)">
                         {{$t('learnActivity.mgtScEv.markData')}}
                     </span>
-                    <div style="float:right;" v-if="$access.ability('admin','mock-eva').validateAll" v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].progress == 'going'">
+                    <!--取消一键作答和一键评分功能-->
+                    <!--<div style="float:right;" v-if="$access.ability('admin','mock-eva').validateAll" v-show="evaListShow[curEvaIndex] && evaListShow[curEvaIndex].progress == 'going'">
                         <Tooltip :content="$t('learnActivity.mgtScEv.autoTips1')" :max-width="240">
                             <Button type="success" size="small" :loading="answerLoading" class="mock-stu-answer" @click="mockAnswer">{{$t('learnActivity.mgtScEv.autoAnswer')}}</Button>
                         </Tooltip>
                         <Tooltip :content="$t('learnActivity.mgtScEv.autoTips2')" :max-width="240">
                             <Button type="warning" size="small" :loading="scoreLoading" class="mock-tea-scoring" @click="mockScoring">{{$t('learnActivity.mgtScEv.autoScore')}}</Button>
                         </Tooltip>
-                    </div>
+                    </div>-->
                 </div>
                 <!--试卷信息-->
                 <div :class="curBarIndex == 1 ? 'animated fadeIn evaluation-base-info':'evaluation-base-info animated fadeOutRight'" v-show="curBarIndex == 1">

+ 1 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/Scoring.vue

@@ -125,7 +125,7 @@ export default {
                     slot: "status",
                     align: "center",
                     fixed: "right",
-                    width: 100,
+                    width: 130,
                 }
             ],
             tableColumn: [],

+ 180 - 0
TEAMModelOS/ClientApp/src/view/settings/AppInfo.vue

@@ -0,0 +1,180 @@
+<template>
+    <div class="app-info">
+        <div class="settings-header">
+            <span :class="['settings-header-item',activeTab === 'info' ?  'active-item' : '']" @click="onTabChange('info')">基础信息</span>
+            <span :class="['settings-header-item',activeTab === 'staff' ?  'active-item' : '']" @click="onTabChange('staff')">人员管理</span>
+            <span :class="['settings-header-item',activeTab === 'inform' ?  'active-item' : '']" @click="onTabChange('inform')">事件订阅</span>
+            <span :class="['settings-header-item',activeTab === 'setting' ?  'active-item' : '']" @click="onTabChange('setting')">开发管理</span>
+            <span :class="['settings-header-item',activeTab === 'auth' ?  'active-item' : '']" @click="onTabChange('auth')">权限管理</span>
+            <Button style="float:right;margin:10px 10px"  @click="goBack"> <Icon type="ios-arrow-back"></Icon>返回</Button>
+        </div>
+        <div class="content-info dark-iview-form">
+            <Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="120">
+                <FormItem label="应用名称:" prop="name">
+                    <Input v-model="formValidate.name" placeholder="请输入应用名称"></Input>
+                </FormItem>
+                <FormItem label="app key:" prop="key">
+                    <Input v-model="formValidate.key" placeholder="请输入appkey"></Input>
+                </FormItem>
+                <FormItem label="app_secret:" prop="secret">
+                    <Input v-model="formValidate.secret" placeholder="请输入app_secret"></Input>
+                </FormItem>
+                <!--<FormItem label="应用图标:">
+                    <Upload>
+                        <Button icon="ios-cloud-upload-outline">点击上传图片</Button>
+                    </Upload>
+                </FormItem>-->
+                <FormItem label="功能模块:" prop="model">
+                    <CheckboxGroup v-model="formValidate.model">
+                        <Checkbox label="模块一"></Checkbox>
+                        <Checkbox label="模块二"></Checkbox>
+                        <Checkbox label="模块三"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                        <Checkbox label="模块四"></Checkbox>
+                    </CheckboxGroup>
+                </FormItem>
+                <FormItem label="限制连接次数:" prop="num">
+                    <Select v-model="formValidate.num" :autosize="{minRows: 2,maxRows: 5}" placeholder="不限制"></Select>
+                </FormItem>
+                <FormItem label="账号ID:" prop="id">
+                    <Input v-model="formValidate.id" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入账号ID"></Input>
+                </FormItem>
+                <FormItem>
+                    <Button type="primary">提交</Button>
+                </FormItem>
+            </Form>
+        </div>
+
+    </div>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                teacherInfo: {
+                    defaultschool: ''
+                },
+                index: 'mge',
+                tableData1: this.mockTableData1(),
+                activeTab: 'info',
+                formValidate: {
+                    name: '',
+                    key: '',
+                    secret: '',
+                    id: '',
+                    model: [],
+                    num: 0
+                },
+                ruleValidate: {
+                    name: [
+                        { required: true, message: '请输入应用名称', trigger: 'blur' }
+                    ],
+                    key: [
+                        { required: true, message: '请输入appkey', trigger: 'blur' }
+                    ],
+                    secret: [
+                        { required: true, message: '请输入app_secret', trigger: 'change' }
+                    ],
+                    id: [
+                        { required: true, message: '请输入使用者ID', trigger: 'change' }
+                    ],
+                    num: [
+                        { required: true, type: 'number', min: 1, message: '请输入使用者ID', trigger: 'change' }
+                    ],
+                    model: [
+                        { required: true, type: 'array', min: 1, message: '选择需要的功能模块', trigger: 'change' }
+                    ],
+                }
+            }
+        },
+        created() {
+
+        },
+        methods: {
+            onTabChange(data) {
+                this.activeTab = ''
+                if (data) {
+                    this.activeTab = data
+                }
+            },
+            goBack() {
+                this.$emit('back','')
+            },
+            mockTableData1() {
+                let data = [];
+                for (let i = 0; i < 10; i++) {
+                    data.push({
+                        name: 'Business' + Math.floor(Math.random() * 100 + 1),
+                        status: Math.floor(Math.random(0,3)),
+                        key: 'hjfgdhfdjkshkjhgjk',
+                        author: 'SOUL',
+                        company: 'habook',
+                        action: Math.floor(Math.random() * 7 + 1),
+                        update: new Date()
+                    })
+                }
+                return data;
+            },
+            getSelect(data) {
+                this.index = data || ''
+            },
+            formatDate(date) {
+                const y = date.getFullYear();
+                let m = date.getMonth() + 1;
+                m = m < 10 ? '0' + m : m;
+                let d = date.getDate();
+                d = d < 10 ? ('0' + d) : d;
+                return y + '-' + m + '-' + d;
+            },
+        },
+        computed: {
+
+        }
+    }
+</script>
+
+<style lang="less" scoped>
+    @import "./OpenMgmt.less";
+</style>
+
+<style lang="less">
+    @border-color:#444;
+    @second-textColor: #CBCBCB;
+
+    //文本副级颜色
+    .app-info {
+        height: 100%;
+        display: flex;
+        flex-direction: column;
+        .settings-header{
+        height: 50px;
+        border-bottom: 1px solid @border-color;
+
+        &-item{
+        display: inline-block;
+        height: 40px;
+        line-height: 40px;
+        margin-top: 5px;
+        margin-left: 50px;
+        color: @label-textColor;
+        cursor: pointer;
+    }
+    .active-item {
+        font-size: 14px;
+        color: #fff;
+        border-bottom: 2px solid @primary-color;
+    }
+    }
+    .content-info{
+        width:50%;
+        margin-left:5%;
+        margin-top:25px;
+    }
+    }
+</style>

+ 96 - 77
TEAMModelOS/ClientApp/src/view/settings/OpenMgmt.vue

@@ -8,27 +8,22 @@
             <vuescroll>
                 <div class="school-list-wrap">
                     <!--<div v-if="mySchoolList.length === 0">
-                        <EmptyData :top="50"></EmptyData>
-                    </div>-->
+                    <EmptyData :top="50"></EmptyData>
+                </div>-->
                     <div class="list-wrap">
-                        <!--<Menu active-name="mge" :open-names="['1']">
-                            <Submenu name="1" >
-                                <template slot="title">
-                                    <Icon type="ios-analytics" />
-                                    应用管理
-                                </template>
-                                    <MenuItem  name="mge">应用列表</MenuItem>
-                                    <MenuItem  name="add">添加应用</MenuItem>
-                            </Submenu>
-                        </Menu>-->
                         <div class="school-item" @click="getSelect('mge')">
                             <span class="school-item-name">
-                                <span>应用管理</span>
+                                <span>服务管理</span>
                             </span>
                         </div>
                         <div class="school-item" @click="getSelect('add')">
                             <span class="school-item-name">
-                                <span>添加应用</span>
+                                <span>添加服务</span>
+                            </span>
+                        </div>                   
+                        <div class="school-item" @click="getSelect('app')">
+                            <span class="school-item-name">
+                                <span>应用管理</span>
                             </span>
                         </div>
                     </div>
@@ -36,73 +31,81 @@
             </vuescroll>
         </div>
         <div class="school-container-right">
-            <div class="school-container-header">
-                <span>应用列表</span>
-                <div>
-                    <Input placeholder="请输入搜索名称或appkey">
-                    <Icon type="ios-search" slot="prefix" />
-                    </Input>
+            <div v-if="!showApp">
+                <div class="school-container-header">
+                    <span>{{index == 'mge'? '应用列表': '设置应用基础信息'}}</span>
+                    <div>
+                        <Input placeholder="请输入搜索名称或appkey">
+                        <Icon type="ios-search" slot="prefix" />
+                        </Input>
+                    </div>
                 </div>
-            </div>
-            <div class="table-wrap" v-show="index == 'mge'">
-                <Table :data="tableData1" :columns="tableColumns1">
-                    <template slot-scope="{ row, index }" slot="status">
-                        <div v-show="row.status == 0">
-                            <Button type="primary" size="small" style="margin-right: 5px">通过</Button>
-                            <Button type="error" size="small">不通过</Button>
-                        </div>
-                    </template>            
-                    <template slot-scope="{ row, index }" slot="action">
-                            <Button type="primary" size="small" style="margin-right: 5px">编辑</Button>
+                <div class="table-wrap" v-show="index == 'mge'">
+                    <Table :data="tableData1" :columns="tableColumns1">
+                        <template slot-scope="{ row, index }" slot="status">
+                            <div v-show="row.status == 0">
+                                <Button type="primary" size="small" style="margin-right: 5px">通过</Button>
+                                <Button type="error" size="small">不通过</Button>
+                            </div>
+                        </template>
+                        <template slot-scope="{ row, index }" slot="action">
+                            <Button type="primary" size="small" style="margin-right: 5px" @click="getAppInfo(row)">编辑</Button>
                             <Button type="error" size="small">删除</Button>
-                    </template>
-                </Table>
-                <div style="margin: 10px;overflow: hidden">
-                    <div style="float: right;">
-                        <Page :total="100" :current="1" @on-change="changePage"></Page>
+                        </template>
+                    </Table>
+                    <div style="margin: 10px;overflow: hidden">
+                        <div style="float: right;">
+                            <Page :total="100" :current="1" @on-change="changePage"></Page>
+                        </div>
                     </div>
                 </div>
-            </div>          
-            <div style="width:45%;margin-top:30px;color:#fff;margin-left:30px" v-show="index == 'add'">
-                <Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="120">
-                    <FormItem label="应用名称:" prop="name">
-                        <Input v-model="formValidate.name" placeholder="请输入应用名称"></Input>
-                    </FormItem>
-                    <FormItem label="app key:" prop="key">
-                        <Input v-model="formValidate.key" placeholder="请输入appkey"></Input>
-                    </FormItem>
-                    <FormItem label="app_secret:" prop="secret">
-                        <Input v-model="formValidate.secret" placeholder="请输入app_secret"></Input>
-                    </FormItem>
-                    <FormItem label="应用图标:">
-                        <Upload>
-                            <Button icon="ios-cloud-upload-outline">点击上传图片</Button>
-                        </Upload>
-                    </FormItem>
-                    <FormItem label="功能模块" prop="model">
-                        <CheckboxGroup v-model="formValidate.model">
-                            <Checkbox label="模块一"></Checkbox>
-                            <Checkbox label="模块二"></Checkbox>
-                            <Checkbox label="模块三"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                            <Checkbox label="模块四"></Checkbox>
-                        </CheckboxGroup>
-                    </FormItem>
-                    <FormItem label="限制连接次数:" prop="num">
-                        <Select v-model="formValidate.num" :autosize="{minRows: 2,maxRows: 5}" placeholder="不限制"></Select>
-                    </FormItem>
-                    <FormItem label="账号ID:" prop="id">
-                        <Input v-model="formValidate.id" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入账号ID"></Input>
-                    </FormItem>
-                    <FormItem>
-                        <Button type="primary">提交</Button>
-                    </FormItem>
-                </Form>
+                <div class="dark-iview-form" style="width:45%;margin-top:30px;color:#fff;margin-left:30px" v-show="index == 'add'">
+                    <Form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="120">
+                        <FormItem label="应用名称:" prop="name">
+                            <Input v-model="formValidate.name" placeholder="请输入应用名称"></Input>
+                        </FormItem>
+                        <FormItem label="app key:" prop="key">
+                            <Input v-model="formValidate.key" placeholder="请输入appkey"></Input>
+                        </FormItem>
+                        <FormItem label="app_secret:" prop="secret">
+                            <Input v-model="formValidate.secret" placeholder="请输入app_secret"></Input>
+                        </FormItem>
+                        <!--<FormItem label="应用图标:">
+                <Upload>
+                    <Button icon="ios-cloud-upload-outline">点击上传图片</Button>
+                </Upload>
+            </FormItem>-->
+                        <FormItem label="功能模块:" prop="model">
+                            <CheckboxGroup v-model="formValidate.model">
+                                <Checkbox label="模块一"></Checkbox>
+                                <Checkbox label="模块二"></Checkbox>
+                                <Checkbox label="模块三"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                                <Checkbox label="模块四"></Checkbox>
+                            </CheckboxGroup>
+                        </FormItem>
+                        <FormItem label="限制连接次数:" prop="num">
+                            <Select v-model="formValidate.num" :autosize="{minRows: 2,maxRows: 5}" placeholder="不限制"></Select>
+                        </FormItem>
+                        <FormItem label="账号ID:" prop="id">
+                            <Input v-model="formValidate.id" :autosize="{minRows: 2,maxRows: 5}" placeholder="请输入账号ID"></Input>
+                        </FormItem>
+                        <FormItem>
+                            <Button type="primary">提交</Button>
+                        </FormItem>
+                    </Form>
+                </div>
+                <div class="table-wrap" v-show="index == 'app'">
+
+                </div>
+            </div>
+            <div v-if="showApp">
+                <appInfo @back="getBack"></appInfo>
             </div>
         </div>
 
@@ -110,6 +113,8 @@
 </template>
 
 <script>
+    import appInfo from './AppInfo.vue'
+
     export default {
         data() {
             return {
@@ -156,6 +161,7 @@
                     model: [],
                     num:0
                 },
+                showApp: false,
                 ruleValidate: {
                     name: [
                         { required: true, message: '请输入应用名称', trigger: 'blur' }
@@ -178,6 +184,9 @@
                 }
             }
         },
+        components: {
+            appInfo
+        },
         created() {
 
         },
@@ -197,9 +206,19 @@
                 }
                 return data;
             },
+            getAppInfo(data) {
+                this.showApp = false
+                if (data) {
+                    this.showApp = true
+                }
+                console.log('appInfo',data)
+            },
             getSelect(data) {
                 this.index = data || ''
             },
+            getBack() {
+                this.showApp = false
+            },
             formatDate(date) {
                 const y = date.getFullYear();
                 let m = date.getMonth() + 1;

+ 23 - 17
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue

@@ -2,15 +2,15 @@
 	<div class="achievement-container">
 		<!-- 进线率统计 -->
 		<Row class-name="base-table-row">
-			<BaseTable :columns="entryRateColumns" :tableName="$t('totalAnalysis.ach_title5')"
+			<BaseTable :columns="entryRateColumns" :tableName="isAllSubject ? $t('totalAnalysis.ach_title5') : $t('totalAnalysis.ach_title5_2')"
 				:tableDatas="entryBarData" tableRef="entryRateTable" :isScroll="false"
-				:tableTitle="$t('totalAnalysis.ach_title5')" ref="rateTable"></BaseTable>
+				:tableTitle="isAllSubject ? $t('totalAnalysis.ach_title5') : $t('totalAnalysis.ach_title5_2')" ref="rateTable"></BaseTable>
 		</Row>
 		<!-- 进线情况统计 -->
 		<Row class-name="base-table-row">
 			<BaseTable ref="entryTable" :columns="entryNumberColumns" :tableName="$t('totalAnalysis.ach_title4')"
 				:tableDatas="entryTableData" tableRef="entryTable" :pageSize="10"
-				:tableTitle="$t('totalAnalysis.ach_title4')" :tips="$t('totalAnalysis.myTable.tip')"></BaseTable>
+				:tableTitle="$t('totalAnalysis.ach_title4')" :tips="isAllSubject ? $t('totalAnalysis.myTable.tip') : ''"></BaseTable>
 		</Row>
 	</div>
 </template>
@@ -52,7 +52,6 @@
 						key: 'className',
 						filters: [],
 						filterMultiple: false,
-						filterRemote(value, row) {}
 					},
 					{
 						title: this.$t('totalAnalysis.ach_table_text1'),
@@ -74,7 +73,7 @@
 							}
 						],
 						filterMultiple: false,
-						filterRemote(value, row) {}
+						// filterRemote(value, row) {}
 					}
 				],
 				entryRateColumns: [{
@@ -85,15 +84,14 @@
 					{
 						title: this.$t('totalAnalysis.base_class'),
 						key: 'className',
-						filters: [],
 						filterMultiple: false,
-						filterRemote(value, row) {}
 					},
 					{
 						title: this.$t('totalAnalysis.sca_chart_text1'),
 						key: 'csRate',
 						sortable: 'custom',
-						minWidth: 50
+						minWidth: 50,
+						renderType:'renderCsRate',
 					},
 					{
 						title: this.$t('totalAnalysis.ach_text7'),
@@ -109,9 +107,7 @@
 						title: this.$t('totalAnalysis.ach_text9'),
 						key: 'overAverageRate',
 						sortable: 'custom',
-						renderType: function(h, params) {
-							return h('span', params.row.overAverageRate + '%')
-						}
+						renderType: 'renderOverRate'
 					},
 					{
 						title: this.$t('totalAnalysis.ach_table_text3'),
@@ -131,9 +127,19 @@
 		},
 
 		created() {
+			if(this.getAnalysisJson){
+				let filterArr = []
+				this.getAnalysisJson.classes.forEach(i => {
+					filterArr.push({
+						label: i.className,
+						value: i.className
+					})
+				})
+				this.entryRateColumns[1].filters = filterArr
+				this.entryNumberColumns[1].filters = filterArr
+			}
 			this.originNumberColumns = JSON.parse(JSON.stringify(this.entryNumberColumns))
 			this.originRateColumns = JSON.parse(JSON.stringify(this.entryRateColumns))
-			
 			let scatter = this.$store.state.totalAnalysis.scatter
 			this.classList = this.$store.state.totalAnalysis.classList
 
@@ -162,11 +168,11 @@
 				// 清除之前的科目columns 添加当前评测的科目columns
 				let fixColumns = this.isAllSubject ? 4 : 3
 				if (!this.isAllSubject) {
-					this.entryRateColumns = this.entryRateColumns.filter(i => i.key !== 'entryNum')
+					this.entryRateColumns = this.entryRateColumns.filter(i => i.key !== 'entryNum' && i.key !== 'overAverageRate')
 					this.entryNumberColumns = this.entryNumberColumns.filter(i => i.key !== 'score')
 				} else {
-					this.entryRateColumns = JSON.parse(JSON.stringify(this.originRateColumns))
-					this.entryNumberColumns = JSON.parse(JSON.stringify(this.originNumberColumns))
+					this.entryRateColumns = this.originRateColumns
+					this.entryNumberColumns = this.originNumberColumns
 				}
 				this.entryNumberColumns.splice(fixColumns, this.entryNumberColumns.length - fixColumns, ...subjectColumns)
 
@@ -209,8 +215,8 @@
 						className: classItem.className,
 						entryNum: classItem.lineCount,
 						totalNum: classItem.stuCount,
-						csRate: this.isAllSubject ? classItem.csRate + '%' : classItem.subjects[this
-							.curSubjectIndex].sRate + '%',
+						csRate: this.isAllSubject ? classItem.csRate : classItem.subjects[this
+							.curSubjectIndex].sRate,
 						overAverageRate: classItem.stuCount > 0 ? ((classItem.lineCount / classItem
 							.stuCount) * 100).toFixed(2) : 0.00,
 						average: this.isAllSubject ? classItem.totalAverage.toFixed(1) : classItem

+ 1 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue

@@ -141,7 +141,7 @@
 									{{ item.stuCount }}
 								</span>
 								<span>{{ $t("totalAnalysis.lostStu") }}:
-									<!-- 得分率数据 -->
+									<!-- 缺考人数数据 -->
 									{{ item.lostStu.length }}
 								</span>
 								<span>{{ $t("totalAnalysis.echarts_text14") }}:

+ 2 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue

@@ -80,7 +80,7 @@
 				        title: item.className,
 				        sortable: 'custom',
 				        key: item.className,
-				        render: (h, params) => {
+				        renderType: (h, params) => {
 				            return h('span', ((Number(origin[params.row.name][index]))).toFixed(2) + '%')
 				        },
 				        minWidth: 150
@@ -121,6 +121,7 @@
 				this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
             }
 			
+			this.isAllClasses = this.$store.state.totalAnalysis.curClassIndex + 1
 			this.$EventBus.$off('changeClassName')
 			this.$EventBus.$on('changeClassName', val => {
 				this.isAllClasses = this.classList.indexOf(val)

+ 7 - 4
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue

@@ -4,7 +4,7 @@
             <Col span="12">
                 <span class="component-title">{{$t('totalAnalysis.ka_title4')}}</span>
                 <span class="pie-to-bar" @click="changeRadarOrBar"><Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
-                <div v-show="!isShowRadar">
+                <div v-if="!isShowRadar">
                     <BaseDetailBar echartsId="knowDetailBar" :classIndex="classIndex"  @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
                 </div>
                 <div v-if="isShowRadar">
@@ -175,7 +175,8 @@
                 this.doRender(this.getKnowledgeData, this.currentPoint,this.curClassIndex)
             },
 
-            doRender(data, point, classIndex) {
+            doRender(data, point) {
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
                 let origin = data.stupercent
                 let keys = origin.keys
                 let datas = classIndex === -1 ? (origin[point] || []) : origin[point].filter(i => i[1] === this.classList[classIndex + 1])
@@ -183,13 +184,15 @@
                 this.tableData = this.$tools.jsonTransform({ datas: datas, keys: keys })
             },
 
-            doRenderWrong(data,classIndex) {
+            doRenderWrong(data) {
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
                 let origin = data.wrong
 				let allWrongData = this.$tools.jsonTransform({ datas: origin.datas, keys: origin.keys })
                 this.numData = classIndex === -1 ?  allWrongData : this.getClassWrongData(allWrongData,classIndex)
             },
 			
-			getClassWrongData(allWrongData,classIndex){
+			getClassWrongData(allWrongData){
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
 				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
 				let curItem = this.getAnalysisJson.classes[classIndex].subjects[curSubjectIndex]
 				allWrongData.forEach((item,index) => {

+ 3 - 1
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue

@@ -70,7 +70,7 @@
             	        title: item.className,
             	        sortable: 'custom',
             	        key: item.className,
-            	        render: (h, params) => {
+            	        renderType: (h, params) => {
             	            return h('span', ((Number(origin[params.row.name][index]))).toFixed(2) + '%')
             	        },
             	        minWidth: 150
@@ -110,6 +110,8 @@
 				this.classList = [this.$t('totalAnalysis.allClasses')].concat([...new Set(this.getAnalysisJson.classes.map(item => item.className))]) // 获取班级列表
             }
 			
+			this.isAllClasses = this.$store.state.totalAnalysis.curClassIndex + 1
+			
 			this.$EventBus.$off('changeClassName')
 			this.$EventBus.$on('changeClassName', val => {
 				this.isAllClasses = this.classList.indexOf(val)

+ 10 - 7
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -7,8 +7,8 @@
 				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />
 				{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}
 			</span>
-			<div v-show="!isShowRadar">
-				<BaseDetailBar echartsId="levelDetailBar" :classIndex="classIndex" :echartData="levelData" @handleItemClick="handleItemClick"
+			<div v-if="!isShowRadar">
+				<BaseDetailBar echartsId="levelDetailBar" :classIndex="classIndex" @handleItemClick="handleItemClick"
 					ref="detailsBar"></BaseDetailBar>
 			</div>
 			<div v-if="isShowRadar">
@@ -169,8 +169,8 @@
 				this.doRender(this.getLevelData, this.currentPoint,this.curClassIndex)
 			},
 
-			doRender(data, point, classIndex) {
-				console.log(...arguments)
+			doRender(data, point) {
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
 				let origin = data.stupercent
 				let keys = origin.keys
 				let datas = classIndex === -1 ? (origin[point] || []) : origin[point].filter(i => i[1] === this.classList[classIndex + 1])
@@ -180,7 +180,8 @@
 				})
 			},
 
-			doRenderWrong(data,classIndex) {
+			doRenderWrong(data) {
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
 				let origin = data.wrong
 				let keys = origin.keys
 				let datas = origin.datas
@@ -193,7 +194,8 @@
 				
 			},
 			
-			getClassWrongData(allWrongData,classIndex){
+			getClassWrongData(allWrongData){
+				let classIndex = this.$store.state.totalAnalysis.curClassIndex
 				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
 				let curItem = this.getAnalysisJson.classes[classIndex].subjects[curSubjectIndex]
 				allWrongData.forEach((item,index) => {
@@ -257,7 +259,8 @@
 				this.curClassIndex = n - 1
 				this.doRender(this.getLevelData,this.getLevelData.pointList[0],n - 1)
 				this.doRenderWrong(this.getLevelData,n - 1)
-			}
+			},
+			immediate:true
 		}
 	}
 </script>

+ 3 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue

@@ -149,6 +149,7 @@
 					{
 					    title: this.$t('totalAnalysis.sca_table_text5'),
 					    sortable: true,
+						key: 'x',
 						renderType: function(h, params) {
 						    return h('span', Number(params.row.x).toFixed(2))
 						},
@@ -252,6 +253,8 @@
 				this.currentClass = 0
 			})
 			
+			this.onClassSelect(this.$store.state.totalAnalysis.curClassIndex + 1)
+			
 			this.$EventBus.$off('changeClassName')
 			this.$EventBus.$on('changeClassName',val => {
 				console.log('落点选择的班级',val)

+ 4 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -112,6 +112,7 @@
 				A2List: [],
 				B1List: [],
 				B2List: [],
+				exersicesType: this.$GLOBAL.EXERCISE_TYPES(),
 				tableColumns: [{
 						title: this.$t('totalAnalysis.ta_table_text1'),
 						key: 'id',
@@ -122,8 +123,8 @@
 						title: this.$t('totalAnalysis.ta_table_text2'),
 						key: 'type',
 						minWidth: 100,
-						renderType: function(h, params) {
-							return h('span', params.row.type || '暂无')
+						renderType: (h, params) => {
+							return h('span', this.exersicesType[params.row.type] || '暂无')
 						},
 					},
 					{
@@ -285,6 +286,7 @@
 		},
 		created() {
 			this.$parent.$parent.$parent.isShowQuestions = false
+			
 		},
 
 		methods: {

+ 16 - 15
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue

@@ -181,10 +181,10 @@
 				if (val === 0) {
 					this.$store.commit('updateExportTable', [{
 						tableRef: 'entryTable',
-						tableName: '进线情况统计'
+						tableName: this.$t('totalAnalysis.ach_title4')
 					}, {
 						tableRef: 'entryRateTable',
-						tableName: '进线率统计'
+						tableName: this.currentScatterClass === 0 ? this.$t('totalAnalysis.ach_title5') : this.$t('totalAnalysis.ach_title5_2')
 					}])
 					this.$router.push({
 						path: '/total'
@@ -209,6 +209,7 @@
 			},
 			
 			onScatterClassSelect(val){
+				this.$store.commit('updateClassIndex',val)
 				this.$EventBus.$emit('changeClassName',this.classList[val])
 			},
 
@@ -224,55 +225,55 @@
 						this.currentClass = 0
 						this.$store.commit('updateExportTable', [{
 							tableRef: 'entryTable',
-							tableName: '进线情况统计'
+							tableName: this.$t('totalAnalysis.ach_title4')
 						}, {
 							tableRef: 'entryRateTable',
-							tableName: '进线率统计'
+							tableName: this.currentScatterClass === 0 ? this.$t('totalAnalysis.ach_title5') : this.$t('totalAnalysis.ach_title5_2')
 						}])
 
 						break
 					case 1:
 						path = '/total/scatter'
-						this.currentScatterClass = 0
+						// this.currentScatterClass = 0
 						this.$store.commit('updateExportTable', [{
 							tableRef: 'scatterTable',
-							tableName: '学生稳定度统计表'
+							tableName: this.$t('totalAnalysis.sca_title2')
 						}])
 						break
 					case 2:
 						path = '/total/test'
 						this.$store.commit('updateExportTable', [{
 							tableRef: 'exerciseAnalsisTable',
-							tableName: '试题分析总表'
+							tableName: this.$t('totalAnalysis.ta_title3')
 						}, {
 							tableRef: 'exerciseScoreRateTable',
-							tableName: '试题得分率表'
+							tableName: this.$t('totalAnalysis.ta_title4')
 						}])
 						break
 					case 3:
 						path = '/total/knowledge'
 						this.$store.commit('updateExportTable', [{
 							tableRef: 'pointScoreRateTable',
-							tableName: '知识点得分率关系表'
+							tableName: this.$t('totalAnalysis.ka_title3')
 						}, {
 							tableRef: 'pointScoreTable',
-							tableName: '知识点得分详情表'
+							tableName: this.$t('totalAnalysis.ka_title5')
 						}, {
 							tableRef: 'pointWrongTable',
-							tableName: '知识点错题率关系表'
+							tableName: this.$t('totalAnalysis.ka_title6')
 						}])
 						break
 					case 4:
 						path = '/total/cognitionLevel'
 						this.$store.commit('updateExportTable', [{
 							tableRef: 'levelScoreRateTable',
-							tableName: '认知层次得分率关系表'
+							tableName: this.$t('totalAnalysis.le_title3')
 						}, {
 							tableRef: 'levelScoreTable',
-							tableName: '认知层次得分详情表'
+							tableName: this.$t('totalAnalysis.le_title5')
 						}, {
 							tableRef: 'levelWrongTable',
-							tableName: '认知层次错题率关系表'
+							tableName: this.$t('totalAnalysis.le_title6')
 						}])
 						break
 					default:
@@ -454,7 +455,7 @@
 			}
 
 			.ivu-select-item-focus {
-				background-color: #565656;
+				background-color: #3c3c3c;
 			}
 		}
 	}

+ 2 - 1
TEAMModelOS/Controllers/Analysis/AchievementController.cs

@@ -3805,6 +3805,7 @@ namespace TEAMModelOS.Controllers.Analysis
             
         }
         [HttpPost("importResult")]
+        [RequestSizeLimit(100_000_000)]//最大允许100M
         public async Task<IActionResult> importClassResult(JsonElement request)
         {
             //获取评测的ID
@@ -3927,7 +3928,7 @@ namespace TEAMModelOS.Controllers.Analysis
                                             }
                                             //answers.Add(stuAns);                                          
                                         });
-                                        ex.ans.Add(answers);
+                                        ex.ans[index] = answers;
                                         string FileName = ex.examId + "/" + ex.subjectId + "/" + examClass.studentIds[index];
                                         string blob = FileName + "/" + "ans.json";
                                         tasks.Add(_azureStorage.UploadFileByContainer(ex.school.ToString(), answers.ToJsonString(), "exam", FileName + "/" + "ans.json"));

+ 17 - 9
TEAMModelOS/Controllers/Common/ExamController.cs

@@ -66,12 +66,13 @@ namespace TEAMModelOS.Controllers
                 ExamInfo exam;
                 string code = request.code;
                 request.code = "Exam-" + request.code;
-                request.createTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                request.startTime = request.startTime == -1 ? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() : request.startTime;
-/*
-                if (request.startTime == -1) {
-                    request.startTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-                }*/
+                long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                request.createTime = now;
+                if (request.startTime <= 0)
+                {
+                    request.startTime = now;
+                }
+                
                 int stuCount = 0;
                 for (int i = 0; i < request.classes.Count; i++)
                 {
@@ -158,7 +159,14 @@ namespace TEAMModelOS.Controllers
                 if (string.IsNullOrEmpty(request.id))
                 {
                     request.id = Guid.NewGuid().ToString();
-                    request.progress = "pending";
+                    if (request.startTime > now)
+                    {
+                        request.progress = "pending";
+                    }
+                    else
+                    {
+                        request.progress = "going";
+                    }
                     int n = 0;
                     foreach (PaperSimple simple in request.papers) {
                         simple.blob = "/exam/" + request.id + "/paper/" + request.subjects[n].id;
@@ -281,7 +289,7 @@ namespace TEAMModelOS.Controllers
             try
             {
                 if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                var query = $"select c.id,c.name,c.code,c.period,c.startTime,c.endTime,c.stuCount,c.type,c.progress,c.examType,c.createTime, c.subjects, c.grades, c.scope,c.classes from c ";
+                var query = $"select c.id,c.name,c.code,c.period,c.startTime,c.endTime,c.stuCount,c.type,c.progress,c.examType,c.createTime, c.subjects, c.grades, c.scope,c.classes,c.sRate,c.lostStu from c ";
                 if (requert.TryGetProperty("classIds", out JsonElement classIds)) {
                     List<string> ids = classIds.ToObject<List<string>>();
                     HashSet<string> strs = new HashSet<string>();
@@ -297,7 +305,7 @@ namespace TEAMModelOS.Controllers
                         strs.Add($"array_contains(c.classes,'{ssr}')");
                     }
                     string ss = string.Join(" or ", strs);
-                    query = $"select c.id,c.name,c.code,c.period,c.startTime,c.endTime,c.stuCount,c.type,c.progress,c.examType,c.createTime, c.subjects, c.grades, c.scope,c.classes from c where ({ss})";
+                    query = $"select c.id,c.name,c.code,c.period,c.startTime,c.endTime,c.stuCount,c.type,c.progress,c.examType,c.createTime, c.subjects, c.grades, c.scope,c.classes,c.sRate,c.lostStu from c where ({ss})";
                 };
                 var client = _azureCosmos.GetCosmosClient();
                 List<ExamInfo> examInfo = new List<ExamInfo>();                

+ 1 - 1
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -81,7 +81,7 @@ namespace TEAMModelOS.Controllers.Learn
                 {
                    
                     request.id = Guid.NewGuid().ToString();
-                    if (request.startTime >= now)
+                    if (request.startTime > now)
                     {
                         request.progress = "pending";
                     }

+ 1 - 1
TEAMModelOS/TEAMModelOS.csproj

@@ -23,7 +23,7 @@
   </ItemGroup>
   <ItemGroup>
     <PackageReference Include="DotNetZip" Version="1.15.0" />
-    <PackageReference Include="HTEXLib" Version="2.5.2" />
+    <PackageReference Include="HTEXLib" Version="2.5.3" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.1" />
     <PackageReference Include="VueCliMiddleware" Version="5.0.0" />
   </ItemGroup>