Browse Source

Merge branch 'develop5.0-tmd' of http://106.12.23.251:10080/TEAMMODEL/TEAMModelOS into develop5.0-tmd

CrazyIter_Bin 4 năm trước cách đây
mục cha
commit
99233d1223
23 tập tin đã thay đổi với 1872 bổ sung1588 xóa
  1. 163 66
      TEAMModelFunction/TriggerExam.cs
  2. 2 0
      TEAMModelOS.SDK/Models/Cosmos/School/ExamResult.cs
  3. 56 54
      TEAMModelOS/ClientApp/src/common/BaseLayout.vue
  4. 16 43
      TEAMModelOS/ClientApp/src/components/evaluation/AnalysisItemTable.vue
  5. 4 4
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.less
  6. 55 24
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  7. 72 196
      TEAMModelOS/ClientApp/src/components/evaluation/OptionsTable.vue
  8. 1 0
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue
  9. 5 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  10. 29 25
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  11. 518 358
      TEAMModelOS/ClientApp/src/router/routes.js
  12. 21 4
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  13. 17 46
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue
  14. 14 6
      TEAMModelOS/ClientApp/src/view/selflearn/SelfLearn.less
  15. 390 342
      TEAMModelOS/ClientApp/src/view/selflearn/SelfLearn.vue
  16. 2 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  17. 268 397
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  18. 1 1
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue
  19. 4 2
      TEAMModelOS/Controllers/Analysis/AnalysisController.cs
  20. 113 0
      TEAMModelOS/Properties/ServiceDependencies/TeammodelOS - Web Deploy/profile.arm.json
  21. 113 0
      TEAMModelOS/Properties/ServiceDependencies/teammodelos-dep - Web Deploy/profile.arm.json
  22. 4 3
      TEAMModelOS/appsettings.Development.json
  23. 4 1
      TEAMModelOS/appsettings.json

+ 163 - 66
TEAMModelFunction/TriggerExam.cs

@@ -18,8 +18,8 @@ namespace TEAMModelFunction
 {
     public class TriggerExam
     {
-        public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing, 
-            CosmosClient client, Document input ,string code,long stime,long etime, string school)
+        public static async void Trigger(AzureCosmosFactory _azureCosmos, AzureServiceBusFactory _serviceBus, AzureStorageFactory _azureStorage, DingDing _dingDing,
+            CosmosClient client, Document input, string code, long stime, long etime, string school)
         {
             ExamInfo info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(input.Id, new Azure.Cosmos.PartitionKey($"{code}"));
             List<ExamClassResult> examClassResults = new List<ExamClassResult>();
@@ -38,7 +38,8 @@ namespace TEAMModelFunction
                     }
                 }
             }
-            else {
+            else
+            {
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryStreamIterator(queryText: $"select value(c) from c where c.examId = '{info.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new Azure.Cosmos.PartitionKey($"ExamClassResult-{school}") }))
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
@@ -51,7 +52,7 @@ namespace TEAMModelFunction
                     }
                 }
             }
-            
+
 
             List<ChangeRecord> records = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", input.Id }, { "PartitionKey", info.progress } });
             //处理科目信息
@@ -88,7 +89,7 @@ namespace TEAMModelFunction
                         //await client.GetContainer("TEAMModelOS", "Common").CreateItemAsync(changeRecord, new Azure.Cosmos.PartitionKey($"{changeRecord.code}"));
                     }
                     break;
-                case "going":                    
+                case "going":
                     //ActivityData data;
                     //if (info.scope == "school")
                     //{
@@ -133,7 +134,8 @@ namespace TEAMModelFunction
                     List<StuActivity> tmdActivities = new List<StuActivity>();
                     if (tmdids.IsNotEmpty())
                     {
-                        tmdids.ForEach(x => {
+                        tmdids.ForEach(x =>
+                        {
                             tmdActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -155,7 +157,8 @@ namespace TEAMModelFunction
                     }
                     if (studentss.IsNotEmpty())
                     {
-                        studentss.ForEach(x => {
+                        studentss.ForEach(x =>
+                        {
                             stuActivities.Add(new StuActivity
                             {
                                 pk = "Activity",
@@ -183,11 +186,12 @@ namespace TEAMModelFunction
                             foreach (ExamSubject subject in info.subjects)
                             {
                                 string classCode = "";
-                                if (string.IsNullOrEmpty(info.school) || !info.scope.Equals("school",StringComparison.OrdinalIgnoreCase))
+                                if (string.IsNullOrEmpty(info.school) || !info.scope.Equals("school", StringComparison.OrdinalIgnoreCase))
                                 {
                                     classCode = "ExamClassResult-" + info.creatorId;
                                 }
-                                else {
+                                else
+                                {
                                     classCode = "ExamClassResult-" + info.school;
                                 }
                                 ExamClassResult result = new ExamClassResult
@@ -232,9 +236,10 @@ namespace TEAMModelFunction
                                     }
                                 }
                                 if (info.scope.Equals("private", StringComparison.OrdinalIgnoreCase))
-                                {                                                                                                        
+                                {
                                     var stuResponse = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList"));
-                                    if (stuResponse.Status == 200) {
+                                    if (stuResponse.Status == 200)
+                                    {
                                         using var json = await JsonDocument.ParseAsync(stuResponse.ContentStream);
                                         StuList stuList = json.ToObject<StuList>();
                                         //result.info.id = stuList.id;
@@ -242,20 +247,21 @@ namespace TEAMModelFunction
                                         //处理发布对象为自选名单(个人)
 
                                         foreach (Students stus in stuList.students)
-                                                {
+                                        {
 
-                                                        ids.Add(stus.id);
-                                                }
-                                                if (stuList.tmids.Count > 0)
-                                                {
-                                                    foreach (string tid in stuList.tmids)
-                                                    {
-                                                        ids.Add(tid);
-                                                    }
-                                                }
-                                    }                                   
+                                            ids.Add(stus.id);
+                                        }
+                                        if (stuList.tmids.Count > 0)
+                                        {
+                                            foreach (string tid in stuList.tmids)
+                                            {
+                                                ids.Add(tid);
+                                            }
+                                        }
+                                    }
                                 }
-                                else {                                                                                                                                                                                                                       
+                                else
+                                {
                                     var stuResponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(cla, new Azure.Cosmos.PartitionKey($"StuList-{info.school}"));
                                     if (stuResponse.Status == 200)
                                     {
@@ -266,9 +272,9 @@ namespace TEAMModelFunction
                                         //处理发布对象为自选名单(校本)
                                         foreach (Students stus in stuList.students)
                                         {
-                                                ids.Add(stus.id);
-                                        }                                      
-                                    }                                    
+                                            ids.Add(stus.id);
+                                        }
+                                    }
                                 }
                                 foreach (string stu in ids)
                                 {
@@ -278,7 +284,7 @@ namespace TEAMModelFunction
                                     result.studentScores.Add(ansPoint);
                                     result.sum.Add(0);
                                 }
-                                
+
                                 //result.progress = info.progress;
                                 result.school = info.school;
                                 m++;
@@ -318,7 +324,7 @@ namespace TEAMModelFunction
                         {
                             if (subject.classCount == info.classes.Count)
                             {
-                                await createClassResultAsync(info, examClassResults, subject, gno,_azureCosmos, _dingDing, _azureStorage);
+                                await createClassResultAsync(info, examClassResults, subject, gno, _azureCosmos, _dingDing, _azureStorage);
                             }
                             gno++;
                         }
@@ -328,10 +334,10 @@ namespace TEAMModelFunction
                     int fno = 0;
                     foreach (ExamSubject subject in info.subjects)
                     {
-                        await createClassResultAsync(info, examClassResults, subject, fno, _azureCosmos, _dingDing, _azureStorage);                       
+                        await createClassResultAsync(info, examClassResults, subject, fno, _azureCosmos, _dingDing, _azureStorage);
                         fno++;
                     }
-                    
+
                     //计算单次考试简易统计信息
                     List<ExamResult> examResults = new List<ExamResult>();
                     await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamResult>(
@@ -340,7 +346,8 @@ namespace TEAMModelFunction
                         examResults.Add(item);
                     }
                     //结算单科单班的标准差和平均分
-                    foreach (ExamClassResult classResult in examClassResults) {
+                    foreach (ExamClassResult classResult in examClassResults)
+                    {
                         //标记单科单班总得分
                         double subScore = 0;
                         //标准差
@@ -370,7 +377,8 @@ namespace TEAMModelFunction
                     double powSum = 0;
                     List<string> losStu = new List<string>();
                     //先与第一个值取并集
-                    if (examResults.Count >0 ) {
+                    if (examResults.Count > 0)
+                    {
                         losStu.Union(examResults[0].lostStus);
                         foreach (ExamResult examResult in examResults)
                         {
@@ -393,26 +401,31 @@ namespace TEAMModelFunction
                         allScore += simple.point.Sum();
                     }
                     //计算全科标准差
-                    foreach (string id in examResults[0].studentIds) {
+                    foreach (string id in examResults[0].studentIds)
+                    {
                         double sc = 0;
-                        foreach (ExamResult result in examResults) {
+                        foreach (ExamResult result in examResults)
+                        {
                             sc += result.studentScores[result.studentIds.IndexOf(id)].Sum();
                         }
-                        powSum += Math.Pow(sc - NewsRateScore , 2);
+                        powSum += Math.Pow(sc - NewsRateScore, 2);
                     }
-                    info.standard = Math.Round(examResults[0].studentIds.Count > 0 ? Math.Pow(powSum / examResults[0].studentIds.Count, 0.5) : 0,2);
-                    double  NewsRate= allScore > 0 ? Math.Round(NewsRateScore / allScore * 100,2) : 0;
+                    info.standard = Math.Round(examResults[0].studentIds.Count > 0 ? Math.Pow(powSum / examResults[0].studentIds.Count, 0.5) : 0, 2);
+                    double NewsRate = allScore > 0 ? Math.Round(NewsRateScore / allScore * 100, 2) : 0;
                     info.lostStu = losStu;
                     //判断均分是否发生变化,便于实时的更新评测基本信息
-                    if (info.sRate != NewsRate || info.average != NewsRateScore) {
+                    if (info.sRate != NewsRate || info.average != NewsRateScore)
+                    {
                         info.sRate = NewsRate;
                         info.average = NewsRateScore;
                         await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<ExamInfo>(info, info.id, new Azure.Cosmos.PartitionKey(info.code));
-                    }         
+                    }
                     break;
             }
         }
-        public static async Task examRecordCount(ExamInfo info, ExamSubject subject, DingDing _dingDing, int no,AzureStorageFactory _azureStorage,ExamResult result) {
+        //处理全部学生选题计数
+        public static async Task examRecordCount(ExamInfo info, ExamSubject subject, DingDing _dingDing, int no, AzureStorageFactory _azureStorage, ExamResult result)
+        {
             try
             {
                 string blobcntr = "";
@@ -420,52 +433,132 @@ namespace TEAMModelFunction
                 {
                     blobcntr = info.school;
                 }
-                else {
+                else
+                {
                     blobcntr = info.creatorId;
                 }
+
+                List<double> scores = new List<double>();
+                foreach (List<double> sc in result.studentScores)
+                {
+                    scores.Add(sc.Sum());
+                }
+                //确定高分组 最低分数
+                scores.Sort((s1, s2) => { return s2.CompareTo(s1); });
+
+                double rhwCount = scores.Count * 0.27;
+                double rhw = rhwCount > 0 ? scores[int.Parse(rhwCount.ToString("0"))] : 0;
+                //double rhw = resultSum[int.Parse(rhwCount.ToString("0"))];
+                //确定低分组 最高分数
+                scores.Sort((s1, s2) => { return s1.CompareTo(s2); });
+                double rhlCount = scores.Count * 0.27;
+                double rhl = rhlCount > 0 ? scores[int.Parse(rhlCount.ToString("0"))] : 0;
+                //存放高分组学生ID
+                List<string> phId = new List<string>();
+                List<string> plId = new List<string>();
+                foreach (string id in result.studentIds)
+                {
+                    int index = result.studentIds.IndexOf(id);
+                    if (result.studentScores[index].Sum() >= rhw)
+                    {
+                        phId.Add(id);
+                        continue;
+                    }
+                    if (result.studentScores[index].Sum() <= rhl)
+                    {
+                        plId.Add(id);
+                        continue;
+                    }
+                }
+
                 var ContainerClient = _azureStorage.GetBlobContainerClient(blobcntr);
                 List<string> items = await ContainerClient.List($"exam/{info.id}/{subject.id}");
                 List<List<List<string>>> ansList = new List<List<List<string>>>();
+                List<List<List<string>>> phAnsList = new List<List<List<string>>>();
+                List<List<List<string>>> plAnsList = new List<List<List<string>>>();
+                List<string> phItems = new List<string>();
+                List<string> plItems = new List<string>();
                 foreach (string item in items)
                 {
+                    //确定高分组选项内容
+                    foreach (string id in phId) {
+                        if (item.Contains($"/{id}/"))
+                        {
+                            var phDownload = await _azureStorage.GetBlobContainerClient(blobcntr).GetBlobClient(item).DownloadAsync();
+                            var phjson = await JsonDocument.ParseAsync(phDownload.Value.Content);
+                            var phRecord = phjson.RootElement.ToObject<List<List<string>>>();
+                            phAnsList.Add(phRecord);
+                            break;
+                        }
+                    }
+                    //确定低分组选项内容
+                    foreach (string id in plId)
+                    {
+                        if (item.Contains($"/{id}/"))
+                        {
+                            var plDownload = await _azureStorage.GetBlobContainerClient(blobcntr).GetBlobClient(item).DownloadAsync();
+                            var pljson = await JsonDocument.ParseAsync(plDownload.Value.Content);
+                            var plRecord = pljson.RootElement.ToObject<List<List<string>>>();
+                            plAnsList.Add(plRecord);
+                            break;
+                        }
+                    }
                     var Download = await _azureStorage.GetBlobContainerClient(blobcntr).GetBlobClient(item).DownloadAsync();
                     var json = await JsonDocument.ParseAsync(Download.Value.Content);
                     var Record = json.RootElement.ToObject<List<List<string>>>();
                     ansList.Add(Record);
                 }
-                /*foreach (List<string> str in info.papers[no].answers) { 
-                    
-                }*/
-                List<Dictionary<string, int>> recorde = new List<Dictionary<string, int>>();
-                for (int i = 0;i< info.papers[no].answers.Count;i++) {
-                    if (info.papers[no].answers[i].Count <= 0) {
+                result.record = getMore(info, no, ansList);
+                result.phc = getMore(info, no, phAnsList);
+                result.plc = getMore(info, no, plAnsList);
+            }
+            catch (Exception ex)
+            {
+                await _dingDing.SendBotMsg($"评测作答记录结算异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+            }
+        }
+
+        //处理选题计数
+        public static List<Dictionary<string, int>> getMore(ExamInfo info, int no, List<List<List<string>>> list)
+        {
+            List<Dictionary<string, int>> recorde = new List<Dictionary<string, int>>();
+            try
+            {
+                for (int i = 0; i < info.papers[no].answers.Count; i++)
+                {
+                    if (info.papers[no].answers[i].Count <= 0)
+                    {
                         recorde.Add(new Dictionary<string, int>());
                         continue;
                     }
                     Dictionary<string, int> optCount = new Dictionary<string, int>();
-                    foreach (List<List<string>> stu in ansList) {
-                        if (stu.Count == info.papers[no].answers.Count) {
+                    foreach (List<List<string>> stu in list)
+                    {
+                        if (stu.Count == info.papers[no].answers.Count)
+                        {
 
                             var item = stu[i];
-                            foreach (string opt in item) {
+                            foreach (string opt in item)
+                            {
                                 if (optCount.ContainsKey(opt))
                                 {
                                     optCount[opt] = optCount[opt] + 1;
                                 }
-                                else { 
-                                    optCount[opt] = 1; 
+                                else
+                                {
+                                    optCount[opt] = 1;
                                 }
                             }
-                          
+
                         }
                     }
                     recorde.Add(optCount);
                 }
-                result.record = recorde;
+                return recorde;
             }
-            catch (Exception ex)
+            catch (Exception)
             {
-                await _dingDing.SendBotMsg($"评测作答记录结算异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
+                return recorde;
             }
         }
         public static async Task createClassResultAsync(ExamInfo info, List<ExamClassResult> examClassResults, ExamSubject subject, int no, AzureCosmosFactory _azureCosmos, DingDing _dingDing, AzureStorageFactory _azureStorage)
@@ -493,13 +586,16 @@ namespace TEAMModelFunction
                     {
                         List<double> newScores = new List<double>();
                         int count = 0;
-                        foreach (double sc in scores) {
+                        foreach (double sc in scores)
+                        {
                             newScores.Add(sc > -1 ? sc : 0);
-                            if(sc == -1) {
+                            if (sc == -1)
+                            {
                                 count++;
                             }
                         }
-                        if (count == scores.Count) {
+                        if (count == scores.Count)
+                        {
                             lostStu.Add(classResult.studentIds[index]);
                             //mcount++;
                         }
@@ -540,25 +636,26 @@ namespace TEAMModelFunction
                 }
             }
             result.average = result.studentIds.Count > 0 ? Math.Round(score * 1.0 / result.studentIds.Count, 2) : 0;
-            foreach (ExamClassResult classResult in examClassResults) {
+            foreach (ExamClassResult classResult in examClassResults)
+            {
 
                 //double classSrate = 0;
                 if (classResult.subjectId.Equals(subject.id))
                 {
                     foreach (string id in classResult.studentIds)
                     {
-                         double sc =  classResult.studentScores[classResult.studentIds.IndexOf(id)].Sum();
-                         powSum += Math.Pow(sc - result.average, 2);
+                        double sc = classResult.studentScores[classResult.studentIds.IndexOf(id)].Sum();
+                        powSum += Math.Pow(sc - result.average, 2);
                     }
                 }
-                             
+
             }
             //处理选项计数内容
             await examRecordCount(info, subject, _dingDing, no, _azureStorage, result);
-            result.standard = Math.Round(result.studentIds.Count > 0 ? Math.Pow(powSum / result.studentIds.Count, 0.5) : 0,2);
+            result.standard = Math.Round(result.studentIds.Count > 0 ? Math.Pow(powSum / result.studentIds.Count, 0.5) : 0, 2);
             result.csRate = csRate;
-            result.lostStus = lostStu;           
-            
+            result.lostStus = lostStu;
+
             result.sRate = Math.Round(result.average / allScore * 100, 2);
             result.classes = classRanges;
             result.code = "ExamResult-" + info.id;

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/School/ExamResult.cs

@@ -42,6 +42,8 @@ namespace TEAMModelOS.SDK.Models
         public List<string> lostStus { get; set; } = new List<string>();
         public double standard { get; set; }
         public List<Dictionary<string, int>> record { get; set; } = new List<Dictionary<string, int>>();
+        public List<Dictionary<string, int>> phc { get; set; } = new List<Dictionary<string, int>>();
+        public List<Dictionary<string, int>> plc { get; set; } = new List<Dictionary<string, int>>();
     }
     public class ClassRange {
 

+ 56 - 54
TEAMModelOS/ClientApp/src/common/BaseLayout.vue

@@ -18,7 +18,7 @@
             <Menu width="auto" :class="menuitemClasses" accordion :active-name="activeName" :open-names="openNames">
                 <vuescroll :ops="ops">
                     <div v-for="(item,index) in menuTree" :key="index">
-                        <Submenu :name="index" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
+                        <Submenu :name="item.subName" v-if="$access.ability(item.role,item.permission).validateAll && item.child.length" v-show="(index == 0 && $store.state.userInfo.hasSchool) || index > 0">
                             <template slot="title">
                                 <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
                                     <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
@@ -26,7 +26,7 @@
                                 <Icon v-show="!isCollapsed" :custom="item.icon" :class="isCollapsed ? 'collapse-icon-size':''" size="20" />
                                 <span>{{item.name}}</span>
                             </template>
-                            <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.router" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-if="$access.ability(menuItem.role,menuItem.permission).validateAll">
+                            <MenuItem class="sub-item-wrap sub-item-wrap-active" :name="menuItem.menuName" :to="menuItem.router" v-for="(menuItem,i) in item.child" :key="i" v-if="$access.ability(menuItem.role,menuItem.permission).validateAll">
                             <Tooltip :content="menuItem.name" placement="right" transfer v-show="isCollapsed">
                                 <Icon class="sub-menu-icon" :custom="menuItem.icon" size="18" />
                             </Tooltip>
@@ -39,7 +39,7 @@
                             </span>
                             </MenuItem>
                         </Submenu>
-                        <MenuItem :name="item.router" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
+                        <MenuItem :name="item.menuName" v-else-if="$access.ability(item.role,item.permission).validateAll" :to="item.router">
                         <Tooltip :content="item.name" placement="right" transfer v-show="isCollapsed">
                             <Icon :custom="item.icon" style="width:55px;text-align:left;" :class="isCollapsed ? 'collapse-icon-size':''" size="22" />
                         </Tooltip>
@@ -73,12 +73,13 @@ export default {
         }
     },
     methods: {
-        initMenu(){
+        initMenu() {
             this.menuTree = [
                 {
                     icon: 'iconfont icon-school',
                     name: this.$t('system.menu.smartSc'),
                     router: '',
+                    subName: 'smartSchool',
                     role: 'teacher|admin',
                     permission: '',
                     child: [
@@ -88,7 +89,8 @@ export default {
                             router: '/home/system',
                             tag: '',
                             role: 'admin',
-                            permission: 'schoolSetting-read|schoolSetting-upd'
+                            permission: 'schoolSetting-read|schoolSetting-upd',
+                            menuName: 'system'
                         },
                         {
                             icon: 'iconfont icon-teacher-mgt',
@@ -96,7 +98,8 @@ export default {
                             router: '/home/teachermgmt',
                             tag: '',
                             role: 'admin',
-                            permission: 'teacher-read|teacher-upd'
+                            permission: 'teacher-read|teacher-upd',
+                            menuName: 'teachermgmt'
                         },
                         {
                             icon: 'iconfont icon-student-mgt',
@@ -104,7 +107,8 @@ export default {
                             router: '/home/studentAccount',
                             tag: '',
                             role: 'admin',
-                            permission: 'student-upd|student-read'
+                            permission: 'student-upd|student-read',
+                            menuName: 'studentAccount'
                         },
                         {
                             icon: 'iconfont icon-class-mgt',
@@ -112,17 +116,9 @@ export default {
                             router: '/home/classroom',
                             tag: '',
                             role: 'admin',
-                            permission: 'classroom-upd|classroom-read'
+                            permission: 'classroom-upd|classroom-read',
+                            menuName: 'classroom'
                         },
-                        //课程设置
-                        // {
-                        //     icon: 'iconfont icon-kecheng',
-                        //     name: this.$t('system.menu.cusSetting'),
-                        //     router: '/home/ManageCourse',
-                        //     tag: 'x',
-                        //     role: 'admin',
-                        //     permission: 'course-read|course-upd',
-                        // },
                         {
                             icon: 'iconfont icon-kecheng',
                             name: this.$t('system.menu.cusMgt'),
@@ -130,6 +126,7 @@ export default {
                             tag: '',
                             role: 'admin',
                             permission: '',
+                            menuName: 'NewCusMgt'
                         },
                         //{
                         //   icon: 'iconfont icon-time',
@@ -154,7 +151,8 @@ export default {
                             router: '/home/serviceDriveAuth',
                             tag: this.$t('system.menu.preview'),
                             role: 'admin',
-                            permission: 'auth-read|auth-upd'
+                            permission: 'auth-read|auth-upd',
+                            menuName: 'serviceDriveAuth'
                         },
                         {
                             icon: 'iconfont icon-syllabus',
@@ -163,6 +161,7 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'syllabus'
                         },
                         {
                             icon: 'iconfont icon-file',
@@ -171,6 +170,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'schoolcontent'
                         },
                         {
                             icon: 'iconfont icon-question-bank',
@@ -179,6 +179,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'schoolBank'
                         },
                         {
                             icon: 'iconfont icon-k-point',
@@ -187,6 +188,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'knowledge'
                         }
                     ]
                 },
@@ -195,6 +197,7 @@ export default {
                     name: this.$t('system.menu.staAna'),
                     router: '',
                     role: 'admin',
+                    subName: 'analysis',
                     permission: 'analysis-read|scboard-read',
                     child: [
                         {
@@ -203,7 +206,8 @@ export default {
                             router: '/totalIndex',
                             tag: '',
                             role: 'admin',
-                            permission: 'analysis-read'
+                            permission: 'analysis-read',
+                            menuName: 'totalIndex'
                         },
                         {
                             icon: 'iconfont icon-school-analysis',
@@ -211,7 +215,8 @@ export default {
                             router: '/home/scboard',
                             tag: this.$t('system.menu.preview'),
                             role: 'admin',
-                            permission: 'scboard-read'
+                            permission: 'scboard-read',
+                            menuName: 'scboard'
                         }
                     ]
                 },
@@ -223,6 +228,7 @@ export default {
                     // permission: 'schoolAc-read|schoolAc-upd',
                     role: 'admin',
                     permission: '',
+                    subName:'scAc',
                     child: [
                         {
                             icon: 'iconfont icon-test',
@@ -230,7 +236,8 @@ export default {
                             router: '/home/schoolEvaluation',
                             tag: '',
                             role: 'admin',
-                            permission: ''
+                            permission: '',
+                            menuName: 'schoolEvaluation'
                         },
                         {
                             icon: 'iconfont icon-vote',
@@ -238,7 +245,8 @@ export default {
                             router: '/home/manageVote',
                             tag: '',
                             role: 'admin',
-                            permission: ''
+                            permission: '',
+                            menuName: 'manageVote'
                         },
                         {
                             icon: 'iconfont icon-questionnaire',
@@ -246,7 +254,8 @@ export default {
                             router: '/home/manageQuestionnaire',
                             tag: '',
                             role: 'admin',
-                            permission: ''
+                            permission: '',
+                            menuName: 'manageQuestionnaire'
                         },
                     ]
                 },
@@ -256,6 +265,7 @@ export default {
                     router: '',
                     role: 'teacher',
                     permission: '',
+                    subName:'cusContent',
                     child: [
                         {
                             icon: 'iconfont icon-syllabus',
@@ -264,6 +274,7 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'personalSyllabus'
                         },
                         {
                             icon: 'iconfont icon-file',
@@ -272,6 +283,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'personalcontent'
                         },
                         {
                             icon: 'iconfont icon-question-bank',
@@ -280,6 +292,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'personalBank'
                         }
                     ]
                 },
@@ -289,6 +302,7 @@ export default {
                     router: '',
                     role: 'teacher|admin',
                     permission: '',
+                    subName:'stuAc',
                     child: [
                         {
                             icon: 'iconfont icon-test',
@@ -297,6 +311,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'privateEvaluation'
                         },
                         {
                             icon: 'iconfont icon-vote',
@@ -305,6 +320,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'personalVote'
                         },
                         {
                             icon: 'iconfont icon-questionnaire',
@@ -313,6 +329,7 @@ export default {
                             tag: '',
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'personalSurvey'
                         },
                         {
                             icon: 'iconfont icon-learning-self',
@@ -321,6 +338,7 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             role: 'teacher|admin',
                             permission: '',
+                            menuName: 'selfLearn'
                         },
                         {
                             icon: 'iconfont icon-hw',
@@ -329,15 +347,8 @@ export default {
                             tag: this.$t('system.menu.preview'),
                             role: 'teacher|admin',
                             permission: '',
-                        },
-                        // {
-                        //     icon: 'iconfont icon-syllabus',
-                        //     name: this.$t('system.menu.acRecord'),
-                        //     router: '/home/manageRecord',
-                        //     tag: this.$t('system.menu.preview'),
-                        //     role: 'teacher|admin',
-                        //     permission: '',
-                        // }
+                            menuName: 'manageHomeWork'
+                        }
                     ]
                 },
                 {
@@ -347,7 +358,8 @@ export default {
                     tag: '',
                     role: 'teacher',
                     permission: '',
-                    child: []
+                    child: [],
+                    menuName: 'manageClass'
                 },
                 {
                     icon: 'iconfont icon-course-self',
@@ -356,7 +368,8 @@ export default {
                     tag: '',
                     role: 'teacher',
                     permission: '',
-                    child: []
+                    child: [],
+                    menuName: 'myCourse'
                 }
             ]
         },
@@ -386,34 +399,23 @@ export default {
     watch: {
         $route: {
             handler(val, oldval) {
-                if(this.menuTree.length == 0){
+                if (this.menuTree.length == 0) {
                     this.initMenu()
                 }
+                console.log(val)
+                let metaName = val.meta.activeName
+                this.activeName = metaName
                 this.openNames = []
-                let flag = false
                 for (let i in this.menuTree) {
-                    if (this.menuTree[i].router == val.path) {
-                        this.activeName = val.path
-                        this.openNames.push(parseInt(i))
-                        flag = true
-                        break
-                    } else {
+                    if (this.menuTree[i].child.length) {
                         for (let j in this.menuTree[i].child) {
-                            if (this.menuTree[i].child[j].router == val.path) {
-                                this.activeName = val.path
-                                this.openNames.push(parseInt(i))
-                                flag = true
+                            if (this.menuTree[i].child[j].menuName == metaName) {
+                                this.activeName = metaName
+                                this.openNames.push(this.menuTree[i].subName)
                                 break
                             }
                         }
                     }
-                    if (flag) {
-                        break
-                    }
-                }
-                if (!flag) {
-                    this.activeName = ''
-                    this.openNames = []
                 }
             },
             // 深度观察监听
@@ -421,7 +423,7 @@ export default {
             //立即执行
             immediate: true
         },
-        '$i18n.locale'(n,o) {
+        '$i18n.locale'(n, o) {
             this.initMenu()
         }
     }

+ 16 - 43
TEAMModelOS/ClientApp/src/components/evaluation/AnalysisItemTable.vue

@@ -10,9 +10,9 @@
 <script>
 	export default {
 		props: {
-			tableDatas: {
-				type: Array,
-				default: () => []
+			analysisJson: {
+				type: Object,
+				default: () => {}
 			},
 
 		},
@@ -38,7 +38,10 @@
 					{
 						title: '难易度',
 						key: 'diff',
-						align: 'center'
+						align: 'center',
+						render: function(h, params) {
+							return h('span', (Number(params.row.diff)).toFixed(2))
+						}
 					},
 					{
 						title: '鉴别度',
@@ -121,52 +124,22 @@
 			}
 		},
 		created() {
-			this.tableData = [{
-				"id": "1",
-				"type": "",
-				"areaName": "A",
-				"score": "3",
-				"diff": "0.775",
-				"identify": " 0.44999999999999996",
-				"classScoreRate": "-",
-				"gradeScoreRate": "hbcn0906:92.68,hbcn0910:90,hbcn0909:84.21,hbcn0907:87.18,hbcn0902:89.47,hbcn0908:87.8,hbcn0901:80.56,hbcn0904:89.47,hbcn0911:85.37,hbcn0912:79.49,hbcn0903:85.37,hbcn0905:87.8",
-				"highScoreRate": "-",
-				"lowScoreRate": "-",
-				"knowledgePoint": "-",
-				"R1": " 1",
-				"R2": " 1",
-				"R3": " 0.98",
-				"R4": " 0.85",
-				"R5": " 0.65",
-				"R6": " 0.35",
-				"PH": " 0.99",
-				"PL": " 0.53",
-				"X": "0.231",
-				"Y": "0.83",
-				"knowledge": "字音",
-				"examScoreRate": "83.33",
-			}]
-
-
+			
 		},
 		methods: {
 
-
 		},
-
 		mounted() {
-
-		},
-
-		computed: {
-			exportTableRefs() {
-				return this.$store.state.totalAnalysis.exportTableRefs
-			}
+			
 		},
-
 		watch: {
-
-
+			analysisJson:{
+				handler(n,o){
+					this.tableData = [n]
+				},
+				immediate:true,
+				deep:true
+			},
 		}
 
 	}

+ 4 - 4
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.less

@@ -109,14 +109,14 @@
 .ev-content {
   background: none;
 }
-.content-wrap {
+.cp-content-wrap {
   position: relative;
   width: 100%;
   height: auto;
   display: flex;
   flex-direction: column;
   padding: 15px;
-  .exercise-item {
+  .cp-exercise-item {
     position: relative;
     width: 100%;
     height: auto;
@@ -133,7 +133,7 @@
     }
   }
 }
-.content-wrap .exercise-item table, .content-wrap .exercise-item td {
+.cp-content-wrap .cp-exercise-item table, .cp-content-wrap .cp-exercise-item td {
   border: 1px solid rgb(128, 128, 128);
   border-collapse: collapse;
   text-align: center;
@@ -144,7 +144,7 @@
   padding: 0 45px;
   border-bottom: 2px solid rgb(128, 128, 128);
 }
-.exercise-item {
+.cp-exercise-item {
   .item-question {
     position: relative;
     cursor: pointer;

+ 55 - 24
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -7,8 +7,8 @@
 			<img src="@/assets/icon/no_data_evaluation.png" width="120" />
 			<span style="margin-top: 15px; color: #808080">{{$t('evaluation.noData')}}</span>
 		</div>
-		<div class="content-wrap" ref="mathJaxContainer" v-else>
-			<div class="exercise-item" v-for="(item, index) of exerciseList" :key="index" @click="onQuestionToggle(index, item.id, $event)">
+		<div class="cp-content-wrap" ref="mathJaxContainer" v-else>
+			<div class="cp-exercise-item" v-for="(item, index) of exerciseList" :key="index" @click="onQuestionToggle(index, item.id, $event)">
 				<!-- 题干部分 -->
 				<div class="item-question">
 					<div>
@@ -31,7 +31,7 @@
 					</div>
 				</div>
 				<div class="exercise-item-children" v-if="item.children.length">
-					<BaseChild :children="item.children" :isShowAnalysis="isShowAnalysis"></BaseChild>
+					<BaseChild :children="item.children" :isShowAnalysis="isShowAnalysis" :analysisJson="getChildAnalysisJson(item)" :optionRate="getChildOptionRate(item)"></BaseChild>
 				</div>
 				<transition name="slide" v-if="item.type !== 'compose'">
 					<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
@@ -67,7 +67,7 @@
 								<div class="item-explain-details">
 									<span v-if="!item.knowledge || !item.knowledge.length">{{$t('evaluation.noPoints')}}</span>
 									<div v-else>
-										<span v-for="(point, index) in item.knowledge" class="item-point-tag" :key="index">
+										<span v-for="(point, pointIndex) in item.knowledge" class="item-point-tag" :key="pointIndex">
 											{{ point }}
 										</span>
 									</div>
@@ -76,9 +76,12 @@
 							<div class="item-explain" v-if="isShowAnalysis">
 								<span class="explain-title">【{{ $t('totalAnalysis.showAnalysis') }}】</span>
 								<div class="item-explain-details">
-									<AnalysisItemTable></AnalysisItemTable>
+									<AnalysisItemTable :analysisJson="analysisJson[index]"></AnalysisItemTable>
 									</br>
-									<OptionsTable v-if="item.type === 'single' || item.type === 'multiple' || item.type === 'judge'"></OptionsTable>
+									<OptionsTable v-if="item.type === 'single' || item.type === 'multiple' || item.type === 'judge'"
+									 :options="item.option.map(i => i.code)" :optionRate="optionRate[index]"
+									 :answer="item.answer"
+									 ></OptionsTable>
 								</div>
 							</div>
 						</div>
@@ -121,6 +124,24 @@
 					return []
 				}
 			},
+			analysisJson:{
+				type:Array,
+				default:() => {
+					return []
+				}
+			},
+			optionRate:{
+				type:Array,
+				default:() => {
+					return []
+				}
+			},
+			flatIds:{
+				type:Array,
+				default:() => {
+					return []
+				}
+			},
 			selQue: {
 			    type: Array,
 			    default: () => {
@@ -157,11 +178,11 @@
 				collapseList: [],
 				selectList:[],
 				originData: [],
-				exerciseList:[]
+				exerciseList:[],
 			};
 		},
 		created() {
-			console.log('接收到的',this.propsList)
+			console.log('接收到的',this.analysisJson)
 			this.pageSize = this.isAnalysis ? 999 : 5
 			this.pageChange(1)
 		},
@@ -179,6 +200,22 @@
 				})
 			},
 			
+			getChildAnalysisJson(pItem){
+				let result = []
+				pItem.children.forEach(child => {
+					result.push(this.analysisJson[this.flatIds.indexOf(child.id)])
+				})
+				return result
+			},
+			
+			getChildOptionRate(pItem){
+				let result = []
+				pItem.children.forEach(child => {
+					result.push(this.optionRate[this.flatIds.indexOf(child.id)])
+				})
+				return result
+			},
+			
 			onSelectItem(item,index){
 				let arrIndex = this.selectList.map(i => i.id).indexOf(item.id)
 				console.log(arrIndex)
@@ -289,23 +326,8 @@
 
 		},
 		mounted() {
-			// 公式渲染
-			this.$nextTick(() => {
-				// window.MathJax.Hub.Queue([
-				// 	"Typeset",
-				// 	MathJax.Hub,
-				// 	this.$refs.mathJaxContainer,
-				// ]);
-			});
-			
-			// console.log('拿到已选',this.selQue)
 			this.selectList = this.selQue
-			
-			// this.$EventBus.$off('onPaperItemChange')
-			// this.$EventBus.$on('onPaperItemChange', data => {
-			// 	console.log('EventBus',data)
-			// 	this.selectList = data
-			// })
+			console.log(this.optionRate)
 		},
 		computed: {
 			curScope() {
@@ -338,6 +360,15 @@
 					}
 				}
 			},
+			optionRate:{
+				handler(n,o){
+					if(n){
+						console.log(n)
+					}
+				},
+				immediate:true,
+				deep:true
+			},
 			examScope:{
 				handler(n,o){
 					this.examPropScope = n

+ 72 - 196
TEAMModelOS/ClientApp/src/components/evaluation/OptionsTable.vue

@@ -3,225 +3,101 @@
 		<!-- 表格组件 -->
 		<Table border ref="table" :data="optionsData" :columns="optionColumns"></Table>
 
-		
+
 
 	</div>
 </template>
 <script>
 	export default {
 		props: {
-			tableDatas: {
+			optionRate: {
+				type: Object,
+				default: () => {}
+			},
+			options: {
 				type: Array,
 				default: () => []
 			},
-			
+			answer:{
+				type: Array,
+				default: () => []
+			}
+
 		},
-		data() {
+		data(vm) {
 			return {
-				dataColumns: [
-				    {
-				        title: '知识点',
-				        key: 'knowledgePoint',
-				        align: 'center',
-				        width: 150
-				    },
-				    {
-				        title: '落点区域',
-				        key: 'areaName',
-				        align: 'center'
-				    },
-				    {
-				        title: '配分',
-				        key: 'score',
-				        align: 'center'
-				    },
-				    {
-				        title: '难易度',
-				        key: 'diff',
-				        align: 'center'
-				    },
-				    {
-				        title: '鉴别度',
-				        key: 'identify',
-				        align: 'center',
-				        render: function (h, params) {
-				            return h('span', (Number(params.row.identify)).toFixed(2))
-				        }
-				    },
-				    {
-				        title: '正答率',
-				        align: 'center',
-				        key: 'classScoreRate'
-				    },
-				    {
-				        title: '高分组正答率',
-				        align: 'center',
-				        key: 'PH',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.PH)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: '低分组正答率',
-				        align: 'center',
-				        key: 'PL',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.PL)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R1',
-				        align: 'center',
-				        key: 'R1',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R1)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R2',
-				        key: 'R2',
-				        align: 'center',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R2)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R3',
-				        align: 'center',
-				        key: 'R3',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R3)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R4',
-				        align: 'center',
-				        key: 'R4',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R4)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R5',
-				        align: 'center',
-				        key: 'R5',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R5)) * 100).toFixed(0) + '%')
-				        }
-				    },
-				    {
-				        title: 'R6',
-				        align: 'center',
-				        key: 'R6',
-				        render: function (h, params) {
-				            return h('span', ((Number(params.row.R6)) * 100).toFixed(0) + '%')
-				        }
-				    }
-				],
-				optionColumns: [
-				    {
-				        title: '选项',
-				        key: 'option',
-				        align: 'center',
-				        width: 150
-				    },
-				    {
-				        title: '选答人数',
-				        key: 'num',
-				        align: 'center'
-				    },
-				    {
-				        title: '选答率',
-				        key: 'rate',
-				        align: 'center',
-				        render: (h, params) => {
-				            return h('div', [
-				                h('Progress', {
-				                    props: {
-				                        percent: params.row.rate,
-				                        strokeColor: params.row.isTrue ? '#14db14' : '#b5bcbe'
-				                    }
-				                })
-				            ])
-				        }
-				    },
-				    {
-				        title: '高分组选答率',
-				        align: 'center',
-				        key: 'PH',
-				        render: function (h, params) {
-				            return h('span', params.row.PH + '%')
-				        }
-				    },
-				    {
-				        title: '低分组选答率',
-				        align: 'center',
-				        key: 'PL',
-				        render: function (h, params) {
-				            return h('span', params.row.PL + '%')
-				        }
-				    }
+				optionsData: [],
+				optionColumns: [{
+						title: vm.$t('totalAnalysis.myTable.option'),
+						key: 'option',
+						align: 'center',
+						width: 150
+					},
+					{
+						title: vm.$t('totalAnalysis.myTable.answerCount'),
+						key: 'num',
+						align: 'center'
+					},
+					{
+						title: vm.$t('totalAnalysis.myTable.answerRate'),
+						key: 'rate',
+						align: 'center',
+						render: (h, params) => {
+							return h('div', [
+								h('Progress', {
+									props: {
+										percent: +params.row.rate.replace('%',''),
+										strokeColor: params.row.isTrue ? '#14db14' : '#b5bcbe'
+									}
+								})
+							])
+						}
+					},
+					{
+						title: vm.$t('totalAnalysis.myTable.RHRate'),
+						align: 'center',
+						key: 'PH',
+					},
+					{
+						title: vm.$t('totalAnalysis.myTable.RLRate'),
+						align: 'center',
+						key: 'PL',
+					}
 				],
 			}
 		},
 		created() {
-			this.optionsData = [
-			    {
-			        option: 'A',
-			        isTrue: false,
-			        num: 12,
-			        rate: 40,
-			        PH: 10,
-			        PL: 60
-			    },
-			    {
-			        option: 'B',
-			        isTrue: false,
-			        num: 6,
-			        rate: 20,
-			        PH: 10,
-			        PL: 23
-			    },
-			    {
-			        option: 'C',
-			        isTrue: true,
-			        num: 9,
-			        rate: 30,
-			        PH: 70,
-			        PL: 10
-			    },
-			    {
-			        option: 'D',
-			        isTrue: false,
-			        num: 3,
-			        rate: 10,
-			        PH: 10,
-			        PL: 7
-			    }
-			]
-
 
 		},
 		methods: {
 
-			
-		},
-
-		mounted() {
-			
-		},
 
-		computed: {
-			exportTableRefs() {
-				return this.$store.state.totalAnalysis.exportTableRefs
-			}
 		},
-
 		watch: {
-			
-			
+			optionRate: {
+				handler(n, o) {
+					if (Object.keys(n).length) {
+						let total = this.$store.state.totalAnalysis.analysisJson.all.total // 取总人数
+						let phCount = Math.floor(total * 0.27) //取高分组人数
+						let plCount = Math.ceil(total * 0.27) //取低分组人数
+						this.options.forEach(key => {
+							this.optionsData.push({
+								option: key,
+								isTrue: this.answer[0].includes(key) ,
+								num: n.record[key] || 0,
+								rate: n.record[key] ? Number((n.record[key] / total) * 100).toFixed(1) +
+									'%' : '0',
+								PH: n.ph[key] ? Number((n.ph[key] / phCount) * 100).toFixed(1) + '%' : 0,
+								PL: n.pl[key] ? Number((n.pl[key] / plCount) * 100).toFixed(1) + '%' : 0,
+							})
+						})
+					}
+				},
+				immediate: true,
+				deep: true
+			},
+
 		}
 
 	}
 </script>
-

+ 1 - 0
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue

@@ -129,6 +129,7 @@
 
 			// 排序操作
 			onSortChange(data) {
+				console.log(JSON.stringify(this.tableDatas[0]))
 				console.log(data)
 				let order = data.order // 当前排序方式 升序、降序、正常
 				let key = data.key // 当前排序依据

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

@@ -267,9 +267,13 @@ export default {
 		rank:'排名统计',
 		option:'选项',
 		answerRate:'选答率',
+		answerCount:'选答人数',
 		RHRate:'高分组选答率',
 		RLRate:'低分组选答率',
 		tip:'* 绿色代表进线,蓝色代表踩线'
-	}
+	},
+	paperSubject:'试卷科目',
+	paperItemsCount:'试卷题数',
+	backUp:'返回上级'
 
 }

+ 29 - 25
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -3,15 +3,15 @@ export default {
 		title: '學情分析儀錶盤',
 		tab1: '統計資料',
 		tab2: '評測數據',
-		noData:'暫無有效數據返回!'
+		noData: '暫無有效數據返回!'
 	},
-	lostStu:'缺考人數',
-	showAnalysis:'資料分析',
-	allSubjects:'全科',
-	allClasses:'所有班級',
-	all:'全部',
-	classBaseInfo:'班級基本數據',
-	scoreRate:'得分率分佈圖',
+	lostStu: '缺考人數',
+	showAnalysis: '資料分析',
+	allSubjects: '全科',
+	allClasses: '所有班級',
+	all: '全部',
+	classBaseInfo: '班級基本數據',
+	scoreRate: '得分率分佈圖',
 	// EvaluationList.vue
 	text1: '歷次考試匯總',
 	text2: '次數',
@@ -85,7 +85,7 @@ export default {
 	module5: '認知層次掌握',
 	exportTable: '匯出表格',
 	currentSubject: '當前科目',
-	goExamList:'查看更多評測',
+	goExamList: '查看更多評測',
 
 	// AchievementAnalysis.vue
 	ach_title1: '得分率統計',
@@ -254,22 +254,26 @@ export default {
 	ql_text13: '返回',
 	ql_text14: '連線題',
 	ql_text15: '改錯題',
-	
-	baseExport:{
-		title:'選擇要匯出的表格',
-		checkAll:'全選',
-		doExport:'匯出',
-		noCheckTip:'請選擇要匯出的表格!'
+
+	baseExport: {
+		title: '選擇要匯出的表格',
+		checkAll: '全選',
+		doExport: '匯出',
+		noCheckTip: '請選擇要匯出的表格!'
+	},
+	myTable: {
+		inner: '進',
+		outer: '踩',
+		rank: '排名統計',
+		option: '選項',
+		answerRate: '選答率',
+		answerCount: '選答人數',
+		RHRate: '高分組選答率',
+		RLRate: '低分組選答率',
+		tip: '*綠色代表進線,藍色代表踩線'
 	},
-	myTable:{
-		inner:'進',
-		outer:'踩',
-		rank:'排名統計',
-		option:'選項',
-		answerRate:'選答率',
-		RHRate:'高分組選答率',
-		RLRate:'低分組選答率',
-		tip:'*綠色代表進線,藍色代表踩線'
-	}
+	paperSubject: '試卷科目',
+	paperItemsCount: '試卷題數',
+	backUp: '返回上級'
 
 }

+ 518 - 358
TEAMModelOS/ClientApp/src/router/routes.js

@@ -89,368 +89,528 @@ export const routes = [
 			middleware: ['login', 'role:admin|teacher'], // 强制登录(会自动跳转到登录页),角色为管理员或教师
 		},
 		children: [{
-				name: 'totalIndex',
-				path: '/totalIndex',
-				component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue'], resolve),
-			},
-			{
-				name: 'total',
-				path: 'total',
-				component: resolve => require(['@/view/student-analysis/total-analysis/index.vue'], resolve),
-				children: [{
-						path: '/total',
-						component: resolve => require([
-							'@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'
-						], resolve)
-					},
-					{
-						path: '/total/evaluationList',
-						component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'],
-							resolve),
-					},
-					{
-						path: '/total/achievement',
-						component: resolve => require([
-							'@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'
-						], resolve),
-					},
-					{
-						path: '/total/achievement/entryTables',
-						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue'],
-							resolve),
-					},
-					{
-						path: '/total/achievement/earlyWarning',
-						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
-							resolve)
-					},
-					{
-						path: '/total/scatter',
-						component: resolve => require(['@/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue'],
-							resolve),
-					},
-					{
-						path: '/total/knowledge',
-						component: resolve => require([
-							'@/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue'
-						], resolve)
-					},
-					{
-						path: '/total/knowledge/details',
-						component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'],
-							resolve)
-					},
-					{
-						path: '/total/cognitionLevel',
-						component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue'],
-							resolve)
-					},
-					{
-						path: '/total/cognitionLevel/details',
-						component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'],
-							resolve)
-					},
-					{
-						path: '/total/test',
-						component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue'],
-							resolve)
-					},
-					{
-						path: '/total/questionList',
-						component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue'],
-							resolve)
-					}
-				]
-			},
-			//校园基础数据管理
-			{
-				name: 'system',
-				path: 'system',
+			name: 'totalIndex',
+			path: '/totalIndex',
+			component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue'], resolve),
+			meta: {
+				activeName: 'totalIndex'
+			}
+		},
+		{
+			name: 'total',
+			path: 'total',
+			component: resolve => require(['@/view/student-analysis/total-analysis/index.vue'], resolve),
+			children: [{
+				path: '/total',
+				component: resolve => require([
+					'@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'
+				], resolve),
 				meta: {
-					middleware: ['login', 'ability:admin,schoolSetting-read|schoolSetting-upd']
-				},
-				component: resolve => require(['@/view/schoolmgmt/SystemSetting/SystemSetting.vue'], resolve)
+					activeName: 'totalIndex'
+				}
 			},
-			//班级教室管理
 			{
-				name: 'classroom',
-				path: 'classroom',
+				path: '/total/evaluationList',
+				component: resolve => require(['@/view/student-analysis/total-analysis/EvaluationList/EvaluationList.vue'],
+					resolve),
 				meta: {
-					middleware: ['login', 'ability:admin,classroom-read|classroom-upd']
-				},
-				component: resolve => require(['@/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue'], resolve)
+					activeName: 'totalIndex'
+				}
 			},
-			//学生账号管理
 			{
-				name: 'studentAccount',
-				path: 'studentAccount',
-				component: resolve => require(['@/view/student-account/Index.vue'], resolve),
+				path: '/total/achievement',
+				component: resolve => require([
+					'@/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue'
+				], resolve),
 				meta: {
-					middleware: ['login', 'ability:admin,student-read|student-upd']
-				},
-
+					activeName: 'totalIndex'
+				}
 			},
-			//教师账号
 			{
-				path: 'teachermgmt',
-				name: 'teachermgmt',
+				path: '/total/achievement/entryTables',
+				component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue'],
+					resolve),
 				meta: {
-					middleware: ['login', 'ability:admin,teacher-read|teacher-upd']
-				},
-				component: () => import('@/view/teachermgmt/Index.vue')
-			},
-			{
-				path: 'evaluation',
-				name: 'evaluation',
-				redirect: '/home/evaluation/testPaperList',
-				component: resolve => require(['@/view/evaluation/index/index.vue'], resolve),
-				children: [{
-						path: 'newSchoolExercise',
-						name: 'newSchoolExercise',
-						component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve)
-					},
-					{
-						path: 'newPrivateExercise',
-						name: 'newPrivateExercise',
-						component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve)
-					},
-					{
-						path: 'testPaper',
-						name: 'testPaper',
-						component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve)
-					},
-					{
-						path: 'testPaperList',
-						name: 'testPaperList',
-						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
-					},
-					{
-						path: 'schoolBank',
-						name: 'schoolBank',
-						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
-					},
-					{
-						path: 'personalBank',
-						name: 'personalBank',
-						component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve)
-					}
-				]
+					activeName: 'totalIndex'
+				}
 			},
 			{
-				path: 'newSchoolPaper',
-				name: 'newSchoolPaper',
-				component: resolve => require(['@/view/evaluation/index/CreatePaper.vue'], resolve)
-			},
-			{
-				path: 'newPrivatePaper',
-				name: 'newPrivatePaper',
-				component: resolve => require(['@/view/evaluation/index/CreatePaper.vue'], resolve)
+				path: '/total/achievement/earlyWarning',
+				component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
 			{
-				path: 'myCourse',
-				name: 'myCourse',
-				component: resolve => require(['@/view/newcourse/MyCourse.vue'], resolve)
+				path: '/total/scatter',
+				component: resolve => require(['@/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
-			//自定义名单管理页面
 			{
-				path: 'MgtStuList',
-				name: 'MgtStuList',
-				component: resolve => require(['@/view/newcourse/MgtStuList.vue'], resolve)
+				path: '/total/knowledge',
+				component: resolve => require([
+					'@/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue'
+				], resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
-			
-			//我的课程查看评测详细数据
 			{
-				path: 'EvDetail',
-				name: 'EvDetail',
-				component: resolve => require(['@/view/newcourse/EvDetail.vue'], resolve)
+				path: '/total/knowledge/details',
+				component: resolve => require(['@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
-
-			//课程管理
 			{
-				path: 'ManageCourse',
-				name: 'ManageCourse',
-				component: resolve => require(['@/view/newcourse/ManageCourse.vue'], resolve)
+				path: '/total/cognitionLevel',
+				component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
-			//新版课程管理
 			{
-				path: 'NewCusMgt',
-				name: 'NewCusMgt',
-				component: resolve => require(['@/view/newcourse/NewCusMgt.vue'], resolve)
+				path: '/total/cognitionLevel/details',
+				component: resolve => require(['@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 			},
-			//课程时间管理
 			{
-				path: 'CourseTime',
-				name: 'CourseTime',
-				component: resolve => require(['@/view/newcourse/CourseTime.vue'], resolve)
-			},
+				path: '/total/test',
+				component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
 
-			//排课管理新版
-			{
-				path: 'NewCoursePlan',
-				name: 'NewCoursePlan',
-				component: resolve => require(['@/view/newcourse/NewCoursePlan.vue'], resolve)
 			},
-			//课程表版本排课
 			{
-				path: 'CoursePlan',
-				name: 'CoursePlan',
-				component: resolve => require(['@/view/newcourse/CoursePlan.vue'], resolve)
-			},
-			// 新课纲管理
-			{
-				path: 'syllabus',
-				name: 'syllabus',
-				component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve)
-			},
-			// 新课纲管理
-			{
-				path: 'personalSyllabus',
-				name: 'personalSyllabus',
-				component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve)
-			},
-			//校本资源管理
-			{
-				path: 'schoolcontent',
-				name: 'schoolcontent',
-				component: resolve => require(['@/view/teachcontent/index.vue'], resolve)
-			},
-			//个人内容管理
-			{
-				path: 'personalcontent',
-				name: 'personalcontent',
-				component: resolve => require(['@/view/teachcontent/index.vue'], resolve)
-			},
-			// 知识点管理
-			{
-				path: 'knowledge',
-				name: 'knowledge',
-				component: resolve => require(['@/view/knowledge-point/index/Index.vue'], resolve)
-			},
-			// 创建校本评测
-			{
-				path: 'createSchoolEva',
-				name: 'createSchoolEva',
-				component: resolve => require(['@/view/learnactivity/CreateSchoolEva.vue'], resolve)
-			},
-			// 创建个人评测
-			{
-				path: 'createPrivEva',
-				name: 'createPrivEva',
-				component: resolve => require(['@/view/learnactivity/CreatePrivEva.vue'], resolve)
-			},
-			//创建学习单元
-			{
-				path: 'createLearnUnit',
-				name: 'createLearnUnit',
-				component: resolve => require(['@/view/selflearn/CreateLearnUnit.vue'], resolve)
-			},
-			//创建作业活动
-			//{
-			//    path: 'createHomeWork',
-			//    name: 'createHomeWork',
-			//    component: resolve => require(['@/view/selflearning/CreateHomeWork.vue'], resolve)
-			//},
-			//创建编序式学习
-			{
-				path: 'createOrderLearn',
-				name: 'createOrderLearn',
-				component: resolve => require(['@/view/selflearn/CreateOrderLearn.vue'], resolve)
-			},
-			//管理评测页面(学校)
-			{
-				path: 'schoolEvaluation',
-				name: 'schoolEvaluation',
-				component: resolve => require(['@/view/learnactivity/MgtSchoolEva.vue'], resolve)
-			},
-			//管理评测页面(个人)
-			{
-				path: 'privateEvaluation',
-				name: 'privateEvaluation',
-				component: resolve => require(['@/view/learnactivity/MgtPrivEva.vue'], resolve)
-			},
-			//管理活动记录页面
-			{
-				path: 'manageRecord',
-				name: 'manageRecord',
-				component: resolve => require(['@/view/learnactivity/ManageRecord.vue'], resolve)
+				path: '/total/questionList',
+				component: resolve => require(['@/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue'],
+					resolve),
+				meta: {
+					activeName: 'totalIndex'
+				}
+			}
+			]
+		},
+		//校园基础数据管理
+		{
+			name: 'system',
+			path: 'system',
+			meta: {
+				middleware: ['login', 'ability:admin,schoolSetting-read|schoolSetting-upd'],
+				activeName: 'system'
 			},
-			//管理问卷调查
-			{
-				path: 'manageQuestionnaire',
-				name: 'manageQuestionnaire',
-				component: resolve => require(['@/view/questionnaire/ManageQuestionnaire.vue'], resolve)
+			component: resolve => require(['@/view/schoolmgmt/SystemSetting/SystemSetting.vue'], resolve)
+		},
+		//班级教室管理
+		{
+			name: 'classroom',
+			path: 'classroom',
+			meta: {
+				middleware: ['login', 'ability:admin,classroom-read|classroom-upd'],
+				activeName: 'classroom'
 			},
-			//管理问卷调查
-			{
-				path: 'personalSurvey',
-				name: 'personalSurvey',
-				component: resolve => require(['@/view/questionnaire/ManageQuestionnaire.vue'], resolve)
+			component: resolve => require(['@/view/schoolmgmt/ClassroomSetting/ClassroomSetting.vue'], resolve)
+		},
+		//学生账号管理
+		{
+			name: 'studentAccount',
+			path: 'studentAccount',
+			component: resolve => require(['@/view/student-account/Index.vue'], resolve),
+			meta: {
+				middleware: ['login', 'ability:admin,student-read|student-upd'],
+				activeName: 'studentAccount'
 			},
-			//新版自主学习
-			{
-				path: 'SelfLearn',
-				name: 'selfLearn',
-				component: resolve => require(['@/view/selflearn/SelfLearn.vue'], resolve)
+
+		},
+		//教师账号
+		{
+			path: 'teachermgmt',
+			name: 'teachermgmt',
+			meta: {
+				middleware: ['login', 'ability:admin,teacher-read|teacher-upd']
 			},
-			{
-				path: 'manageHomeWork',
-				name: 'manageHomeWork',
-				component: resolve => require(['@/view/homework/ManageHomeWork.vue'], resolve)
+			component: () => import('@/view/teachermgmt/Index.vue'),
+			meta: {
+				activeName: 'teachermgmt'
 			},
-			{
-				path: 'manageVote',
-				name: 'manageVote',
-				component: resolve => require(['@/view/vote/ManageVote.vue'], resolve)
+		},
+		{
+			path: 'evaluation',
+			name: 'evaluation',
+			redirect: '/home/evaluation/testPaperList',
+			meta: {
+				activeName: 'schoolBank'
 			},
-			{
-				path: 'personalVote',
-				name: 'personalVote',
-				component: resolve => require(['@/view/vote/ManageVote.vue'], resolve)
+			component: resolve => require(['@/view/evaluation/index/index.vue'], resolve),
+			children: [{
+				path: 'newSchoolExercise',
+				name: 'newSchoolExercise',
+				component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve),
+				meta: {
+					activeName: 'schoolBank'
+				},
 			},
-			//主页
 			{
-				path: 'homePage',
-				name: 'homePage',
-				component: resolve => require(['@/view/homepage/HomePage.vue'], resolve)
+				path: 'newPrivateExercise',
+				name: 'newPrivateExercise',
+				component: resolve => require(['@/view/evaluation/index/CreateExercises.vue'], resolve),
+				meta: {
+					activeName: 'personalBank'
+				},
 			},
-			//班级管理
 			{
-				path: 'manageClass',
-				name: 'manageClass',
-				component: resolve => require(['@/view/classmgt/ManageClass.vue'], resolve)
+				path: 'testPaper',
+				name: 'testPaper',
+				component: resolve => require(['@/view/evaluation/index/TestPaper.vue'], resolve),
+				meta: {
+					activeName: 'schoolBank'
+				},
 			},
-			//用户反馈
 			{
-				path: 'feedback',
-				name: 'feedback',
-				component: resolve => require(['@/view/feedback/Feedback.vue'], resolve)
+				path: 'testPaperList',
+				name: 'testPaperList',
+				component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve),
+				meta: {
+					activeName: 'schoolBank'
+				},
 			},
-			//设置
 			{
-				path: 'settings',
-				name: 'settings',
-				component: resolve => require(['@/view/settings/Index.vue'], resolve)
+				path: 'schoolBank',
+				name: 'schoolBank',
+				component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve),
+				meta: {
+					activeName: 'schoolBank'
+				},
 			},
-			//课堂记录
 			{
-				path: 'classRecord',
-				name: 'classRecord',
-				component: resolve => require(['@/view/classrecord/ClassRecord.vue'], resolve)
-			},
+				path: 'personalBank',
+				name: 'personalBank',
+				component: resolve => require(['@/view/evaluation/bank/index.vue'], resolve),
+				meta: {
+					activeName: 'personalBank'
+				}
+			}
+			]
+		},
+		{
+			path: 'newSchoolPaper',
+			name: 'newSchoolPaper',
+			component: resolve => require(['@/view/evaluation/index/CreatePaper.vue'], resolve),
+			meta: {
+				activeName: 'schoolBank'
+			}
+		},
+		{
+			path: 'newPrivatePaper',
+			name: 'newPrivatePaper',
+			component: resolve => require(['@/view/evaluation/index/CreatePaper.vue'], resolve),
+			meta: {
+				activeName: 'personalBank'
+			}
+		},
+		{
+			path: 'myCourse',
+			name: 'myCourse',
+			component: resolve => require(['@/view/newcourse/MyCourse.vue'], resolve),
+			meta: {
+				activeName: 'NewCusMgt'
+			}
+		},
+		//自定义名单管理页面
+		{
+			path: 'MgtStuList',
+			name: 'MgtStuList',
+			component: resolve => require(['@/view/newcourse/MgtStuList.vue'], resolve),
+			meta: {
+				activeName: 'myCourse'
+			}
+		},
 
-			//Louise的智能教室使用分析儀表板
-			{
-				path: 'scboard',
-				name: 'scboard',
-				component: resolve => require(['@/view/scboard/Index.vue'], resolve)
-			},
+		//我的课程查看评测详细数据
+		{
+			path: 'EvDetail',
+			name: 'EvDetail',
+			component: resolve => require(['@/view/newcourse/EvDetail.vue'], resolve),
+			meta: {
+				activeName: 'myCourse'
+			}
+		},
 
-			//Louise的教師儲存空間授權管理分頁
-			{
-				path: 'serviceDriveAuth',
-				name: 'serviceDriveAuth',
-				component: resolve => require(['@/view/serviceDriveAuth/Index.vue'], resolve)
+		//课程管理(废弃)
+		{
+			path: 'ManageCourse',
+			name: 'ManageCourse',
+			component: resolve => require(['@/view/newcourse/ManageCourse.vue'], resolve)
+		},
+		//新版课程管理
+		{
+			path: 'NewCusMgt',
+			name: 'NewCusMgt',
+			component: resolve => require(['@/view/newcourse/NewCusMgt.vue'], resolve),
+			meta: {
+				activeName: 'NewCusMgt'
+			}
+		},
+		//课程时间管理(废弃)
+		{
+			path: 'CourseTime',
+			name: 'CourseTime',
+			component: resolve => require(['@/view/newcourse/CourseTime.vue'], resolve)
+		},
+
+		//排课管理新版(废弃)
+		{
+			path: 'NewCoursePlan',
+			name: 'NewCoursePlan',
+			component: resolve => require(['@/view/newcourse/NewCoursePlan.vue'], resolve)
+		},
+		//课程表版本排课
+		{
+			path: 'CoursePlan',
+			name: 'CoursePlan',
+			component: resolve => require(['@/view/newcourse/CoursePlan.vue'], resolve),
+			meta: {
+				activeName: 'NewCusMgt'
+			}
+		},
+		// 新课纲管理
+		{
+			path: 'syllabus',
+			name: 'syllabus',
+			component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve),
+			meta: {
+				activeName: 'syllabus'
+			}
+		},
+		// 新课纲管理
+		{
+			path: 'personalSyllabus',
+			name: 'personalSyllabus',
+			component: resolve => require(['@/view/syllabus/newSyllabus/Index.vue'], resolve),
+			meta: {
+				activeName: 'personalSyllabus'
+			}
+		},
+		//校本资源管理
+		{
+			path: 'schoolcontent',
+			name: 'schoolcontent',
+			component: resolve => require(['@/view/teachcontent/index.vue'], resolve),
+			meta: {
+				activeName: 'schoolcontent'
 			}
+		},
+		//个人内容管理
+		{
+			path: 'personalcontent',
+			name: 'personalcontent',
+			component: resolve => require(['@/view/teachcontent/index.vue'], resolve),
+			meta: {
+				activeName: 'personalcontent'
+			}
+		},
+		// 知识点管理
+		{
+			path: 'knowledge',
+			name: 'knowledge',
+			component: resolve => require(['@/view/knowledge-point/index/Index.vue'], resolve),
+			meta: {
+				activeName: 'knowledge'
+			}
+		},
+		// 创建校本评测
+		{
+			path: 'createSchoolEva',
+			name: 'createSchoolEva',
+			component: resolve => require(['@/view/learnactivity/CreateSchoolEva.vue'], resolve),
+			meta: {
+				activeName: 'schoolEvaluation'
+			}
+		},
+		// 创建个人评测
+		{
+			path: 'createPrivEva',
+			name: 'createPrivEva',
+			component: resolve => require(['@/view/learnactivity/CreatePrivEva.vue'], resolve),
+			meta: {
+				activeName: 'privateEvaluation'
+			}
+		},
+		//创建学习单元
+		{
+			path: 'createLearnUnit',
+			name: 'createLearnUnit',
+			component: resolve => require(['@/view/selflearn/CreateLearnUnit.vue'], resolve),
+			meta: {
+				activeName: 'selfLearn'
+			}
+		},
+		//创建作业活动
+		//{
+		//    path: 'createHomeWork',
+		//    name: 'createHomeWork',
+		//    component: resolve => require(['@/view/selflearning/CreateHomeWork.vue'], resolve)
+		//},
+		//创建编序式学习
+		{
+			path: 'createOrderLearn',
+			name: 'createOrderLearn',
+			component: resolve => require(['@/view/selflearn/CreateOrderLearn.vue'], resolve),
+			meta: {
+				activeName: 'selfLearn'
+			}
+		},
+		//管理评测页面(学校)
+		{
+			path: 'schoolEvaluation',
+			name: 'schoolEvaluation',
+			component: resolve => require(['@/view/learnactivity/MgtSchoolEva.vue'], resolve),
+			meta: {
+				activeName: 'schoolEvaluation'
+			}
+		},
+		//管理评测页面(个人)
+		{
+			path: 'privateEvaluation',
+			name: 'privateEvaluation',
+			component: resolve => require(['@/view/learnactivity/MgtPrivEva.vue'], resolve),
+			meta: {
+				activeName: 'privateEvaluation'
+			}
+		},
+		//管理活动记录页面(暂未使用)
+		{
+			path: 'manageRecord',
+			name: 'manageRecord',
+			component: resolve => require(['@/view/learnactivity/ManageRecord.vue'], resolve)
+		},
+		//管理问卷调查
+		{
+			path: 'manageQuestionnaire',
+			name: 'manageQuestionnaire',
+			component: resolve => require(['@/view/questionnaire/ManageQuestionnaire.vue'], resolve),
+			meta: {
+				activeName: 'manageQuestionnaire'
+			}
+		},
+		//管理问卷调查
+		{
+			path: 'personalSurvey',
+			name: 'personalSurvey',
+			component: resolve => require(['@/view/questionnaire/ManageQuestionnaire.vue'], resolve),
+			meta: {
+				activeName: 'personalSurvey'
+			}
+		},
+		//新版自主学习
+		{
+			path: 'SelfLearn',
+			name: 'selfLearn',
+			component: resolve => require(['@/view/selflearn/SelfLearn.vue'], resolve),
+			meta: {
+				activeName: 'selfLearn'
+			}
+		},
+		{
+			path: 'manageHomeWork',
+			name: 'manageHomeWork',
+			component: resolve => require(['@/view/homework/ManageHomeWork.vue'], resolve),
+			meta: {
+				activeName: 'manageHomeWork'
+			}
+		},
+		{
+			path: 'manageVote',
+			name: 'manageVote',
+			component: resolve => require(['@/view/vote/ManageVote.vue'], resolve),
+			meta: {
+				activeName: 'manageVote'
+			}
+		},
+		{
+			path: 'personalVote',
+			name: 'personalVote',
+			component: resolve => require(['@/view/vote/ManageVote.vue'], resolve),
+			meta: {
+				activeName: 'personalVote'
+			}
+		},
+		//主页
+		{
+			path: 'homePage',
+			name: 'homePage',
+			component: resolve => require(['@/view/homepage/HomePage.vue'], resolve),
+			meta: {
+				activeName: 'homePage'
+			}
+		},
+		//班级管理
+		{
+			path: 'manageClass',
+			name: 'manageClass',
+			component: resolve => require(['@/view/classmgt/ManageClass.vue'], resolve),
+			meta: {
+				activeName: 'manageClass'
+			}
+		},
+		//用户反馈
+		{
+			path: 'feedback',
+			name: 'feedback',
+			component: resolve => require(['@/view/feedback/Feedback.vue'], resolve),
+			meta: {
+				activeName: 'feedback'
+			}
+		},
+		//设置
+		{
+			path: 'settings',
+			name: 'settings',
+			component: resolve => require(['@/view/settings/Index.vue'], resolve),
+			meta: {
+				activeName: 'settings'
+			}
+		},
+		//课堂记录
+		{
+			path: 'classRecord',
+			name: 'classRecord',
+			component: resolve => require(['@/view/classrecord/ClassRecord.vue'], resolve),
+			meta: {
+				activeName: 'myCourse'
+			}
+		},
+
+		//Louise的智能教室使用分析儀表板
+		{
+			path: 'scboard',
+			name: 'scboard',
+			component: resolve => require(['@/view/scboard/Index.vue'], resolve),
+			meta: {
+				activeName: 'scboard'
+			}
+		},
+
+		//Louise的教師儲存空間授權管理分頁
+		{
+			path: 'serviceDriveAuth',
+			name: 'serviceDriveAuth',
+			component: resolve => require(['@/view/serviceDriveAuth/Index.vue'], resolve),
+			meta: {
+				activeName: 'serviceDriveAuth'
+			}
+		}
 		]
 	},
 	//学生端
@@ -466,48 +626,48 @@ export const routes = [
 		children: [{
 			name: "homeView",
 			path: "homeView",
-				component: resolve => require(['@/components/student-web/HomeView/HomeView'], resolve),
-			},
-			{
-				name: "courseList",
-				path: "courseList",
-				component: resolve => require(['@/components/student-web/HomeView/CourseListView'], resolve), //是元件不用''
-			},
-			{
-				name: "setting",
-				path: "setting",
-				component: resolve => require(['@/components/student-web/SettingView/SettingView'], resolve), //是元件不用'
-			},
-			{
-				name: "eventView",
-				path: "eventView",
-				component: resolve => require(['@/components/student-web/EventView/EventView'], resolve),
-			},
-			{
-				name: "eventView/:name",
-				path: "eventView/:name",
-				component: resolve => require(['@/components/student-web/EventView/EventView'], resolve),
-			},
-			{
-				name: "eventLatest",
-				path: "eventLatest",
-				component: resolve => require(['@/components/student-web/EventView/EventOverView/EventLatest'], resolve),
-			},
-			{
-				name: "studyView",
-				path: "studyView",
-				component: resolve => require(['@/components/student-web/StudyView/StudyView'], resolve),
-			},
-			{
-				name: "hiteachView",
-				path: "hiteachView",
-				component: resolve => require(['@/components/student-web/HiteachView/HiteachView'], resolve),
-			},
-			{
-				name: "informView",
-				path: "informView",
-				component: resolve => require(['@/components/student-web/InformView/InformView'], resolve),
-			}
+			component: resolve => require(['@/components/student-web/HomeView/HomeView'], resolve),
+		},
+		{
+			name: "courseList",
+			path: "courseList",
+			component: resolve => require(['@/components/student-web/HomeView/CourseListView'], resolve), //是元件不用''
+		},
+		{
+			name: "setting",
+			path: "setting",
+			component: resolve => require(['@/components/student-web/SettingView/SettingView'], resolve), //是元件不用'
+		},
+		{
+			name: "eventView",
+			path: "eventView",
+			component: resolve => require(['@/components/student-web/EventView/EventView'], resolve),
+		},
+		{
+			name: "eventView/:name",
+			path: "eventView/:name",
+			component: resolve => require(['@/components/student-web/EventView/EventView'], resolve),
+		},
+		{
+			name: "eventLatest",
+			path: "eventLatest",
+			component: resolve => require(['@/components/student-web/EventView/EventOverView/EventLatest'], resolve),
+		},
+		{
+			name: "studyView",
+			path: "studyView",
+			component: resolve => require(['@/components/student-web/StudyView/StudyView'], resolve),
+		},
+		{
+			name: "hiteachView",
+			path: "hiteachView",
+			component: resolve => require(['@/components/student-web/HiteachView/HiteachView'], resolve),
+		},
+		{
+			name: "informView",
+			path: "informView",
+			component: resolve => require(['@/components/student-web/InformView/InformView'], resolve),
+		}
 		]
 	}
 ]

+ 21 - 4
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -67,7 +67,10 @@
 					<div class="item-explain" v-if="isShowAnalysis">
 						<span class="explain-title">【{{ $t('totalAnalysis.showAnalysis') }}】</span>
 						<div class="item-explain-details">
-							<OptionsTable></OptionsTable>
+							<AnalysisItemTable :analysisJson="analysisJson[index]"></AnalysisItemTable>
+							</br>
+							<OptionsTable v-if="item.type === 'single' || item.type === 'multiple' || item.type === 'judge'" 
+							:options="item.option.map(i => i.code)" :optionRate="optionRate[index]" :answer="item.answer"></OptionsTable>
 						</div>
 					</div>
 				</div>
@@ -78,10 +81,11 @@
 </template>
 <script>
 	import '@/utils/Math.uuid'
+	import AnalysisItemTable from '@/components/evaluation/AnalysisItemTable'
 	import OptionsTable from '@/components/evaluation/OptionsTable'
 	export default {
 		name: 'BaseChild',
-		components: { OptionsTable },
+		components: { AnalysisItemTable,OptionsTable },
 		props: {
 			children: {
 				type: Array,
@@ -91,6 +95,18 @@
 				type: Number,
 				default: 0
 			},
+			analysisJson:{
+				type:Array,
+				default:() => {
+					return []
+				}
+			},
+			optionRate:{
+				type:Array,
+				default:() => {
+					return []
+				}
+			},
 			isShowScore: {
 				type: Boolean,
 				default: false
@@ -162,13 +178,14 @@
 				handler(n) {
 
 				}
-			}
+			},
 		}
 
 	}
 </script>
+
 <style lang="less" scoped>
-	@import "../index/CommonExercise.less";
+	@import "../../../components/evaluation/ExerciseList.less";
 </style>
 <style lang="less" scoped>
 	.child-wrap {

+ 17 - 46
TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue

@@ -193,11 +193,9 @@ import { json } from 'd3'
 					code: ''
 				},
 				currentParams: {
-					//code: '',
 					subjectId: '',
 					school_code: '',
 					periodId: '',
-					//type: 0
 				},
 				drag: false,
 				isDragging: false,
@@ -252,7 +250,8 @@ import { json } from 'd3'
 				curDragPoint: null,
 				pointIndex: null,
 				pointDatas: {},
-                updated:false
+				updated: false,
+				setCount: false
 			}
 		},
 		components: {
@@ -264,13 +263,11 @@ import { json } from 'd3'
 		},
 		created() {
 			this.initSchoolData()
-			this.initBlockCount()
 		},
 		methods: {
 
 			/* 知识点拖动开始 */
 			onDragStart(item) {
-				console.log(item)
 				this.curDragPoint = item
 				this.isDragging = true
 			},
@@ -339,28 +336,6 @@ import { json } from 'd3'
 				this.isComposeBlock = true
 			},
 
-			/* 保存最新知识块内容 */
-			savePointAndBlock(pointItem) {
-				return new Promise((r, j) => {
-					pointItem.code = pointItem.code.replace('Knowledge-', '')
-					this.$api.knowledge.SaveOrUpdateKnowledge([pointItem]).then(res => {
-						if (!res.error && res.knowledges) {
-							this.curDragPoint = null
-							this.isLoading = false
-							this.checkedPointList = []
-							this.initBlockCount()
-                            this.$Message.success(this.$t('knowledge.success'))
-							r(200)
-						} else {
-                            this.isLoading = false
-						}
-					}).catch(err => {
-						j(err)
-                        this.$Message.warning(this.$t('knowledge.fail'))
-					})
-				})
-			},
-
 			// 获取当前学校学段学科等基本信息
 			initSchoolData() {
 				this.$store.dispatch('user/getSchoolProfile').then(res => {
@@ -371,7 +346,6 @@ import { json } from 'd3'
 						this.originData = schoolBaseInfo // 默认选择第一个
 						if (schoolBaseInfo.period.length) {
 							this.periodList = schoolBaseInfo.period
-							//this.currentParams.code = schoolBaseInfo.id
 							this.currentParams.school_code = schoolBaseInfo.id
 							this.currentParams.periodId = schoolBaseInfo.period[0].id
 							this.currentPeriodIndex = 0 // 默认选择第一个学段
@@ -383,6 +357,7 @@ import { json } from 'd3'
 
 			// 获取当前册别数量(每次都获取最新的数据)
 			initBlockCount() {
+				this.setCount = false
 				let params = {}
 					for (let data of this.subjectList) {
                         params[this.$store.state.userInfo.schoolCode + "-" + data.id] = this.periodList[this.currentPeriodIndex].id
@@ -390,6 +365,7 @@ import { json } from 'd3'
 					this.$api.syllabus.FindBlockCount(params).then(res => {
 						if (res.datas.length) {
 							this.$nextTick(() => {
+								this.setCount = true  //开始监听数据
 								this.blockCounts = res.datas
                                 this.schoolBlockCount = res.datas.map(i => i.countBlock)
 								this.privateBlockCount = res.datas.map(i => i.countBlock)
@@ -405,13 +381,11 @@ import { json } from 'd3'
                 let params = JSON.parse(JSON.stringify(this.currentParams))
                 params.type = 0
 				this.$api.knowledge.GetSchoolPoints(params).then(res => {
-					console.log(res.length)
                     if (res.length > 0) {
                         that.pointDatas = res
                         let list = res[0].blocks
                         this.blockList = list
                         this.originBlockList = JSON.parse(JSON.stringify(list))
-                        // this.handleBlockTap(0, list.length ? list[0] : null)
                         setTimeout(function () {
                             that.isLoadBlocks = false
                         }, 400)
@@ -442,15 +416,14 @@ import { json } from 'd3'
 			// 根据学科获取学科下所有知识点数据
 			getPointsData() {
 				let that = this
-				//this.currentParams.type = 1
 				this.$api.knowledge.GetSchoolPoints(this.currentParams).then(res => {
 					if (res.length) {
-						console.log(res)
 						this.pointList = res[0].points
 						this.originPointList = JSON.parse(JSON.stringify(res[0].points))
 						setTimeout(function () {
 							that.isLoadPoints = false
 						}, 800)
+                        this.updated = false
 					}
 				})
 			},
@@ -573,7 +546,6 @@ import { json } from 'd3'
 				this.editBlock = {}
 				this.isAddBlock = false // 关闭窗口
 				this.blockCounts = []
-				//this.initBlockCount()
 			},
 
 			// 添加知识点完成
@@ -593,7 +565,6 @@ import { json } from 'd3'
 				this.isEditPoint = false
 				setTimeout(function () {
 					that.isLoadPoints = false
-					//that.initBlockCount()
 				}, 400)
 			},
 			//查询当前关联的知识块数据
@@ -642,7 +613,6 @@ import { json } from 'd3'
 							this.handleBlockTap(0, this.blockList.length ? this.blockList[0] : null)
 							setTimeout(() => {
 								that.blockCounts = []
-								//that.initBlockCount()
 								that.isLoading = false
                                 that.$Message.success(this.$t('knowledge.delSuccess'))
 							}, 1000)
@@ -756,7 +726,6 @@ import { json } from 'd3'
 					this.activeBlockIndex = null
 					this.curBlockPoints = []
                     this.$Message.success(this.$t('knowledge.success'))
-					//this.initBlockCount()
 				}
 			},
 
@@ -811,21 +780,21 @@ import { json } from 'd3'
 				}
 			},
 			//保存修改后的数据
-			saveData() {
-                if (this.updated) {
+             saveData() {
+				 if (this.updated) {
+					this.setCount = false
                     let params = {}
                     params = this.pointDatas[0]
                     params.points = [...this.originPointList]
 					params.blocks = [...this.originBlockList]
-                    console.log(params)
                     this.$api.knowledge.SaveOrUpdateKnowledge(params).then(res => {
-                        if (res) {
+						if (res) {
                             this.$Message.success(this.$t('knowledge.saveSuccess'))
 							this.getPointsData()
-							this.initBlockCount()
+							//this.initBlockCount()
                         } else {
                             this.$Message.warning(this.$t('knowledge.saveFail'))
-                        }
+						}
                     }).catch(err => {
                         this.$Message.error(this.$t('knowledge.saveFail'))
                         this.isLoadBlocks = false
@@ -845,14 +814,16 @@ import { json } from 'd3'
 		watch: {
             originBlockList: {
 				handler(newValue, oldValue) {
-					//console.log(newValue)
-					this.updated = true
+					if (this.setCount) {
+						this.updated = true
+                    }
                 }
 			},
             originPointList: {
 				handler(newValue, oldValue) {
-					//console.log(newValue)
-					this.updated = true
+					if (this.setCount) {
+						this.updated = true
+                    }
                 }
             },
 		},

+ 14 - 6
TEAMModelOS/ClientApp/src/view/selflearn/SelfLearn.less

@@ -11,14 +11,13 @@
     display: flex;
     flex-direction: row;
     .order-learn-list-box {
-        width: 400px;
+        width: 100%;
         height: 100%;
-        border-right: 1px solid @borderColor;
-        padding-left: 15px;
+        padding-left: 10px;
     }
 
     .order-learn-main {
-        width: ~"calc(100% - 400px)";
+        width: 100%;
         height: 100%;
         padding-left: 15px;
     }
@@ -33,7 +32,12 @@
     }
 
 }
-
+.learn-list-header{
+    height: 45px;
+    line-height: 45px;
+    color: white;
+    border-bottom: 1px solid @borderColor;
+}
 .order-learn-main {
     .main-bar-wrap {
         width: 100%;
@@ -72,7 +76,6 @@
     }
 }
 .to-create-icon {
-    float: right;
     margin-right: 15px;
     margin-top: 8px;
     cursor: pointer;
@@ -90,4 +93,9 @@
     display: inline-block;
     line-height: 45px;
     height:45px;
+}
+.learn-action-wrap{
+    float: right;
+    height: 45px;
+    line-height: 45px;
 }

+ 390 - 342
TEAMModelOS/ClientApp/src/view/selflearn/SelfLearn.vue

@@ -1,400 +1,448 @@
 <template>
-    <div class="manage-order-learn">
+    <div class="manage-order-learn dark-iview-split">
         <Loading v-if="isLoading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
-        <div class="order-learn-list-box">
-            <div class="dark-iview-tabs-line" style="padding-top:10px;height:100%;">
-                <Tabs v-model="listType" @on-click="toggleList" style="height:100%;">
-                    <div slot="extra">
-                        <Icon type="md-add" class="to-create-icon" @click="createData" title="新增" />
-                        <Icon type="md-trash" :color="editIconStatus ? 'white':'#808080'" :style="{'cursor': editIconStatus ? 'pointer':'not-allowed'}" class="to-create-icon" @click="deleteData" title="删除" />
+        <Split v-model="split1">
+            <div slot="left" class="order-learn-list-box">
+                <div class="learn-list-header">
+                    <Dropdown class="sort-dropdown" trigger="click" placement="bottom-start" @on-click="function(e){ listType = e }" @on-visible-change="dropdownStates">
+                        <span style="cursor: pointer;">
+                            <b class="title">{{ typeLabel }}</b>
+                            <Icon type="ios-arrow-down" style="margin-left:8px;"></Icon>
+                        </span>
+                        <DropdownMenu slot="list" v-for="(item,index) in typeLsit" :value="item.value" :key="index">
+                            <DropdownItem :name="item.value">{{ item.label }}</DropdownItem>
+                        </DropdownMenu>
+                    </Dropdown>
+                    <div class="learn-action-wrap">
                         <Icon type="md-create" :color="editIconStatus ? 'white':'#808080'" :style="{'cursor': editIconStatus ? 'pointer':'not-allowed'}" class="to-create-icon" @click="editInfo" title="编辑" />
+                        <Icon type="md-trash" :color="editIconStatus ? 'white':'#808080'" :style="{'cursor': editIconStatus ? 'pointer':'not-allowed'}" class="to-create-icon" @click="deleteData" title="删除" />
+                        <Icon type="md-add" class="to-create-icon" @click="createData" title="新增" />
                     </div>
-                    <TabPane label="学习单元" name="unit" style="height:calc(100% - 40px);">
-                        <vuescroll>
-                            <UnitList :class="listType == 1 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :unitList="unitList"></UnitList>
-                        </vuescroll>
-                    </TabPane>
-                    <TabPane label="编序式学习" name="order" style="height:calc(100% - 40px);">
-                        <vuescroll>
-                            <OrderLearnList :class="listType == 0 ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :orderLearnList="orderLearnList"></OrderLearnList>
-                        </vuescroll>
-                    </TabPane>
-
-                </Tabs>
-            </div>
-        </div>
-        <div class="order-learn-main">
-            <div class="main-bar-wrap">
-                <span :class="currentTabIndex == 1 ? 'main-header-tab line-bottom line-bottom-active':'main-header-tab line-bottom'" @click="selectTab(1)">学习数据</span>
-                <span :class="currentTabIndex == 0 ? 'main-header-tab line-bottom line-bottom-active':'main-header-tab line-bottom'" @click="selectTab(0)">学习内容</span>
-            </div>
-            <div class="order-learn-main-body dark-iview-split" v-if="listType == 'order' && orderLearnList[currentLearnIndex]">
-                <OrderLearnInfo v-if="currentTabIndex == 0" :orderLearnInfo="orderLearnList[currentLearnIndex]"></OrderLearnInfo>
-                <ActivityInfo ref="activityInfo" v-else :learnContent="learnContent" :classList="classList"></ActivityInfo>
-            </div>
-            <div class="order-learn-main-body dark-iview-split" v-else-if="listType == 'unit' && unitList[currentUnitIndex]">
-                <UnitInfo v-if="currentTabIndex == 0" :unitInfo="unitList[currentUnitIndex]"></UnitInfo>
-                <ActivityInfo ref="activityInfo" v-else :learnContent="learnContent" :classList="classList"></ActivityInfo>
+                </div>
+                <div class="dark-iview-tabs-line" style="padding-top:10px;height:100%;">
+                    <vuescroll>
+                        <UnitList v-show="listType == 'unit'" :class="listType == 'unit' ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :unitList="unitList"></UnitList>
+                        <OrderLearnList v-show="listType == 'order'" :class="listType == 'order' ? 'animated fadeIn':''" @selectIndex="selectOrderLearn" :orderLearnList="orderLearnList"></OrderLearnList>
+                    </vuescroll>
+                </div>
             </div>
-            <div v-else>
-                <EmptyData style="padding-top:150px;"></EmptyData>
+            <div slot="right" class="order-learn-main">
+                <div class="main-bar-wrap">
+                    <span :class="currentTabIndex == 1 ? 'main-header-tab line-bottom line-bottom-active':'main-header-tab line-bottom'" @click="selectTab(1)">学习数据</span>
+                    <span :class="currentTabIndex == 0 ? 'main-header-tab line-bottom line-bottom-active':'main-header-tab line-bottom'" @click="selectTab(0)">学习内容</span>
+                </div>
+                <div class="order-learn-main-body dark-iview-split" v-if="listType == 'order' && orderLearnList[currentLearnIndex]">
+                    <OrderLearnInfo v-if="currentTabIndex == 0" :orderLearnInfo="orderLearnList[currentLearnIndex]"></OrderLearnInfo>
+                    <ActivityInfo ref="activityInfo" v-else :learnContent="learnContent" :classList="classList"></ActivityInfo>
+                </div>
+                <div class="order-learn-main-body dark-iview-split" v-else-if="listType == 'unit' && unitList[currentUnitIndex]">
+                    <UnitInfo v-if="currentTabIndex == 0" :unitInfo="unitList[currentUnitIndex]"></UnitInfo>
+                    <ActivityInfo ref="activityInfo" v-else :learnContent="learnContent" :classList="classList"></ActivityInfo>
+                </div>
+                <div v-else>
+                    <EmptyData style="padding-top:150px;"></EmptyData>
+                </div>
             </div>
-        </div>
-        <Modal v-model="editStatus"
-               :title="listType == 'order' ? '编辑编序式教材' : '编辑自学单元'"
-               @on-ok="confirmEdit">
+        </Split>
+
+        <Modal v-model="editStatus" :title="listType == 'order' ? '编辑编序式教材' : '编辑自学单元'" @on-ok="confirmEdit">
             <p>确认跳转到<span style="padding:0px 5px;">{{ listType == 'order' ? '编序式教材':'自学单元'}}</span>编辑页面?</p>
         </Modal>
     </div>
 </template>
 <script>
-    import QuestionList from '@/components/learnactivity/QuestionList.vue'
-    import ContentFileList from '@/components/selflearn/ContentFileList.vue'
-    import OrderLearnList from './OrderLearnList.vue'
-    import UnitList from './UnitList.vue'
-    import OrderLearnInfo from './OrderLearnInfo.vue'
-    import UnitInfo from './UnitInfo.vue'
-    import ActivityInfo from './ActivityInfo.vue'
+import QuestionList from '@/components/learnactivity/QuestionList.vue'
+import ContentFileList from '@/components/selflearn/ContentFileList.vue'
+import OrderLearnList from './OrderLearnList.vue'
+import UnitList from './UnitList.vue'
+import OrderLearnInfo from './OrderLearnInfo.vue'
+import UnitInfo from './UnitInfo.vue'
+import ActivityInfo from './ActivityInfo.vue'
 
-    export default {
-        components: {
-            QuestionList, ContentFileList, OrderLearnList, UnitList, OrderLearnInfo, UnitInfo, ActivityInfo
-        },
-        data() {
-            return {
-                year: '',
-                semester: '',
-                requestIds: [],
-                classList: [],
-                currentTabIndex: 1,
-                listType: 'unit',//order: 编序式教材 unit:学习单元
-                isLoading: false,
-                sasString: '',
-                editStatus: false,
-                orderLearnList: [],
-                unitList: [],
-                currentLearnIndex: 0,
-                currentUnitIndex: 0
+export default {
+    components: {
+        QuestionList, ContentFileList, OrderLearnList, UnitList, OrderLearnInfo, UnitInfo, ActivityInfo
+    },
+    data() {
+        return {
+            split1: 0.2,
+            year: '',
+            semester: '',
+            requestIds: [],
+            classList: [],
+            currentTabIndex: 1,
+            listType: 'unit',//order: 编序式教材 unit:学习单元
+            isLoading: false,
+            sasString: '',
+            editStatus: false,
+            orderLearnList: [],
+            unitList: [],
+            currentLearnIndex: 0,
+            currentUnitIndex: 0,
+            typeLsit: [
+                {
+                    label: '学习单元',
+                    value: 'unit'
+                },
+                {
+                    label: '编序式学习',
+                    value: 'order'
+                }
+            ]
+        }
+    },
+    computed: {
+        typeLabel: function () {
+            let pId = this.listType
+            let name = ''
+            if (pId) {
+                let temp = this.typeLsit.filter(item => {
+                    return pId == item.value
+                })
+                if (temp.length > 0) name = temp[0].label
             }
+            return name
         },
-        computed: {
-            editIconStatus() {
-                if (this.listType == 'order') {
-                    if (this.orderLearnList.length > 0) {
-                        return true
-                    } else {
-                        return false
-                    }
+        editIconStatus() {
+            if (this.listType == 'order') {
+                if (this.orderLearnList.length > 0) {
+                    return true
                 } else {
-                    if (this.unitList.length > 0) {
-                        return true
-                    } else {
-                        return false
-                    }
+                    return false
                 }
-            },
-            learnContent() {
-                if (this.listType == 'order') {
-                    if (this.orderLearnList.length > 0) {
-                        return this.orderLearnList[this.currentLearnIndex]
-                    } else {
-                        return {}
-                    }
+            } else {
+                if (this.unitList.length > 0) {
+                    return true
                 } else {
-                    if (this.unitList.length > 0) {
-                        return this.unitList[this.currentUnitIndex]
-                    } else {
-                        return {}
-                    }
+                    return false
                 }
             }
         },
-        watch: {
-            learnContent: {
-                handler(n, o) {
-                    if (this.requestIds.indexOf(this.learnContent.id) == -1) {
-                        this.findTask()
-                    }
-                },
-                deep: true
+        learnContent() {
+            if (this.listType == 'order') {
+                if (this.orderLearnList.length > 0) {
+                    return this.orderLearnList[this.currentLearnIndex]
+                } else {
+                    return {}
+                }
+            } else {
+                if (this.unitList.length > 0) {
+                    return this.unitList[this.currentUnitIndex]
+                } else {
+                    return {}
+                }
             }
-        },
-        methods: {
-            setStartTime(date, data) {
-                this.activityInfo.startTime = new Date(date).getTime()
-            },
-            setEndTime(date, data) {
-                this.activityInfo.endTime = new Date(date).getTime()
+        }
+    },
+    watch: {
+        learnContent: {
+            handler(n, o) {
+                if (this.requestIds.indexOf(this.learnContent.id) == -1) {
+                    this.findTask()
+                }
             },
+            deep: true
+        }
+    },
+    methods: {
+        dropdownStates(flag) {
+            if (!flag) this.toggleList()
+        },
+        setStartTime(date, data) {
+            this.activityInfo.startTime = new Date(date).getTime()
+        },
+        setEndTime(date, data) {
+            this.activityInfo.endTime = new Date(date).getTime()
+        },
 
-            /**
-             * 发布活动
-            */
-            publishActivity() {
-                this.publishStatus = true
-            },
+        /**
+         * 发布活动
+        */
+        publishActivity() {
+            this.publishStatus = true
+        },
 
-            selectTab(index) {
-                this.currentTabIndex = index
-            },
-            createData() {
-                if (this.listType == 'order') {
-                    this.$router.push({
-                        name: 'createOrderLearn'
-                    })
-                } else {
-                    this.$router.push({
-                        name: 'createLearnUnit'
-                    })
-                }
-            },
-            /**
-             * 删除编序式教材或自学单元
-             * */
-            deleteData() {
-                let name = this.listType == 'order' ? this.orderLearnList[this.currentLearnIndex].name : this.unitList[this.currentUnitIndex].name
-                this.$Modal.confirm({
-                    title: this.listType == 'unit' ? '删除学习单元' : '删除编序式学习',
-                    content: '确认删除' + name + '吗?',
-                    onOk: () => {
-                        //this.confirmDelete()
-                        this.$Message.warning('暂未对接删除API')
-                    }
+        selectTab(index) {
+            this.currentTabIndex = index
+        },
+        createData() {
+            if (this.listType == 'order') {
+                this.$router.push({
+                    name: 'createOrderLearn'
                 })
-            },
-            /**
-             * 确认删除编序式教材或自学单元
-             * */
-            confirmDelete() {
-                if (this.listType == 'order') {
-                    let requestData = {
-                        id: this.orderLearnList[this.currentLearnIndex].id,
-                        pk: this.orderLearnList[this.currentLearnIndex].code
-                    }
-                    this.$api.learnActivity.DeleteLeanProcess(requestData).then(
-                        res => {
-                            if (res.error == null) {
-                                let index = this.currentLearnIndex
-                                this.currentLearnIndex = 0
-                                this.orderLearnList.splice(index, 1)
-                                this.$Message.success('删除成功!')
+            } else {
+                this.$router.push({
+                    name: 'createLearnUnit'
+                })
+            }
+        },
+        /**
+         * 删除编序式教材或自学单元
+         * */
+        deleteData() {
+            let name = this.listType == 'order' ? this.orderLearnList[this.currentLearnIndex].name : this.unitList[this.currentUnitIndex].name
+            this.$Modal.confirm({
+                title: this.listType == 'unit' ? '删除学习单元' : '删除编序式学习',
+                content: '确认删除' + name + '吗?',
+                onOk: () => {
+                    //this.confirmDelete()
+                    this.$Message.warning('暂未对接删除API')
+                }
+            })
+        },
+        /**
+         * 确认删除编序式教材或自学单元
+         * */
+        confirmDelete() {
+            if (this.listType == 'order') {
+                let requestData = {
+                    id: this.orderLearnList[this.currentLearnIndex].id,
+                    pk: this.orderLearnList[this.currentLearnIndex].code
+                }
+                this.$api.learnActivity.DeleteLeanProcess(requestData).then(
+                    res => {
+                        if (res.error == null) {
+                            let index = this.currentLearnIndex
+                            this.currentLearnIndex = 0
+                            this.orderLearnList.splice(index, 1)
+                            this.$Message.success('删除成功!')
 
-                            } else {
-                                this.$Message.success('删除失败!')
-                            }
-                        },
-                        err => {
+                        } else {
                             this.$Message.success('删除失败!')
                         }
-                    )
-                } else {
-                    let requestData = {
-                        id: this.unitList[this.currentUnitIndex].id,
-                        pk: this.unitList[this.currentUnitIndex].code
+                    },
+                    err => {
+                        this.$Message.success('删除失败!')
                     }
-                    this.$api.learnActivity.DeleteUnit(requestData).then(
-                        res => {
-                            if (res.error == null) {
-                                let index = this.currentUnitIndex
-                                this.currentUnitIndex = 0
-                                this.unitList.splice(index, 1)
-                                this.$Message.success('删除成功!')
-                            } else {
-                                this.$Message.success('删除失败!')
-                            }
-                        },
-                        err => {
+                )
+            } else {
+                let requestData = {
+                    id: this.unitList[this.currentUnitIndex].id,
+                    pk: this.unitList[this.currentUnitIndex].code
+                }
+                this.$api.learnActivity.DeleteUnit(requestData).then(
+                    res => {
+                        if (res.error == null) {
+                            let index = this.currentUnitIndex
+                            this.currentUnitIndex = 0
+                            this.unitList.splice(index, 1)
+                            this.$Message.success('删除成功!')
+                        } else {
                             this.$Message.success('删除失败!')
                         }
-                    )
-                }
-            },
-            /**
-             * 切换列表类型
-             * */
-            toggleList() {
-                if (this.listType == 'order') {
-                    this.findOrderLearn()
-                } else {
-                    this.findUnit()
-                }
-            },
-            //查询学习任务
-            findTask() {
-                if (this.learnContent.id) {
-                    this.$api.learnActivity.findTask({
-                        id: this.learnContent.id
-                    }).then(
-                        (res) => {
-                            if (res.error == null) {
-                                let resData = res.tasks
-                                for (let index in resData) {
-                                    for (let i in this.classList) {
-                                        if (this.classList[i].classroomCode == resData[index].code) {
-                                            this.$set(this.classList[i], [resData[index].id], resData[index])
-                                            break
-                                        }
+                    },
+                    err => {
+                        this.$Message.success('删除失败!')
+                    }
+                )
+            }
+        },
+        /**
+         * 切换列表类型
+         * */
+        toggleList() {
+            if (this.listType == 'order') {
+                this.findOrderLearn()
+            } else {
+                this.findUnit()
+            }
+        },
+        //查询学习任务
+        findTask() {
+            if (this.learnContent.id) {
+                this.$api.learnActivity.findTask({
+                    id: this.learnContent.id
+                }).then(
+                    (res) => {
+                        if (res.error == null) {
+                            let resData = res.tasks
+                            for (let index in resData) {
+                                for (let i in this.classList) {
+                                    if (this.classList[i].classroomCode == resData[index].code) {
+                                        this.$set(this.classList[i], [resData[index].id], resData[index])
+                                        break
                                     }
                                 }
-                                this.requestIds.push(this.learnContent.id)
-                            } else {
-                                this.$Message.error('API error!')
                             }
-                        },
-                        (err) => {
+                            this.requestIds.push(this.learnContent.id)
+                        } else {
                             this.$Message.error('API error!')
                         }
-                    )
-                }
-            },
-            goToCreate() {
-                if (this.listType == 'order') {
-                    this.$router.push({
-                        name: 'createOrderLearn'
-                    })
-                } else {
-                    this.$router.push({
-                        name: 'createLearnUnit'
-                    })
-                }
+                    },
+                    (err) => {
+                        this.$Message.error('API error!')
+                    }
+                )
+            }
+        },
+        goToCreate() {
+            if (this.listType == 'order') {
+                this.$router.push({
+                    name: 'createOrderLearn'
+                })
+            } else {
+                this.$router.push({
+                    name: 'createLearnUnit'
+                })
+            }
 
-            },
-            /**
-             * 查找教师课程下的班级(班级)
-             * */
-            findClassroom() {
-                if (this.classList.length == 0) {
-                    this.$api.learnActivity.FindClassroomByTeacherId({
-                        code: this.$store.state.userInfo.schoolCode,
-                        id: this.$store.state.userInfo.TEAMModelId
-                    }).then(
-                        res => {
-                            if (!res.error) {
-                                this.classList = res.courses
-                                if (this.classList.length > 0) {
-                                    this.findTask()
-                                    setTimeout(() => {
-                                        this.$refs['activityInfo'].getClassroomStudent()
-                                    }, 1000)
-                                }
-                            } else {
-                                this.$Message.error('API ERROR!')
+        },
+        /**
+         * 查找教师课程下的班级(班级)
+         * */
+        findClassroom() {
+            if (this.classList.length == 0) {
+                this.$api.learnActivity.FindClassroomByTeacherId({
+                    code: this.$store.state.userInfo.schoolCode,
+                    id: this.$store.state.userInfo.TEAMModelId
+                }).then(
+                    res => {
+                        if (!res.error) {
+                            this.classList = res.courses
+                            if (this.classList.length > 0) {
+                                this.findTask()
+                                setTimeout(() => {
+                                    this.$refs['activityInfo'].getClassroomStudent()
+                                }, 1000)
                             }
-                        },
-                        err => {
+                        } else {
                             this.$Message.error('API ERROR!')
                         }
-                    ).finally(() => {
-                        setTimeout(() => {
-                            this.isLoading = false
-                        },500)
-                    })
+                    },
+                    err => {
+                        this.$Message.error('API ERROR!')
+                    }
+                ).finally(() => {
+                    setTimeout(() => {
+                        this.isLoading = false
+                    }, 500)
+                })
+            }
+        },
+        downloadFile(item) {
+            window.location.href = item.blobUrl + this.sasString
+        },
+        confirmEdit() {
+            if (this.listType == 'order') {
+                let orderLearnInfo = this.orderLearnList[this.currentLearnIndex]
+                this.$router.push({
+                    name: 'createOrderLearn',
+                    params: {
+                        orderLearnInfo
+                    }
+                })
+            } else {
+                //编辑最小单元
+                let unitInfo = this.unitList[this.currentUnitIndex]
+                this.$router.push({
+                    name: 'createLearnUnit',
+                    params: {
+                        unitInfo
+                    }
+                })
+            }
+
+        },
+        editInfo() {
+            this.editStatus = true
+        },
+        selectOrderLearn(index) {
+            if (this.listType == 'order') {
+                this.currentStepIndex = 0
+                this.currentLearnIndex = index
+            } else {
+                this.currentUnitIndex = index
+            }
+            this.$refs['activityInfo'].checkFindRecord()
+        },
+        /**
+         * 查询编序式教材列表
+         * */
+        findOrderLearn() {
+            if (this.orderLearnList.length == 0) {
+                let requestData = {
+                    code: this.$store.state.userInfo.TEAMModelId
                 }
-            },
-            downloadFile(item) {
-                window.location.href = item.blobUrl + this.sasString
-            },
-            confirmEdit() {
-                if (this.listType == 'order') {
-                    let orderLearnInfo = this.orderLearnList[this.currentLearnIndex]
-                    this.$router.push({
-                        name: 'createOrderLearn',
-                        params: {
-                            orderLearnInfo
-                        }
-                    })
-                } else {
-                    //编辑最小单元
-                    let unitInfo = this.unitList[this.currentUnitIndex]
-                    this.$router.push({
-                        name: 'createLearnUnit',
-                        params: {
-                            unitInfo
+                this.$api.learnActivity.FindOrderLearn(requestData).then(
+                    res => {
+                        if (res.error == null) {
+                            this.orderLearnList = res.result.data
+                        } else {
+                            this.$Message.error('API ERROR!')
                         }
-                    })
-                }
+                    },
+                    err => {
 
-            },
-            editInfo() {
-                this.editStatus = true
-            },
-            selectOrderLearn(index) {
-                if (this.listType == 'order') {
-                    this.currentStepIndex = 0
-                    this.currentLearnIndex = index
-                } else {
-                    this.currentUnitIndex = index
-                }
-                this.$refs['activityInfo'].checkFindRecord()
-            },
-            /**
-             * 查询编序式教材列表
-             * */
-            findOrderLearn() {
-                if (this.orderLearnList.length == 0) {
-                    let requestData = {
-                        code: this.$store.state.userInfo.TEAMModelId
                     }
-                    this.$api.learnActivity.FindOrderLearn(requestData).then(
-                        res => {
-                            if (res.error == null) {
-                                this.orderLearnList = res.result.data
-                            } else {
-                                this.$Message.error('API ERROR!')
-                            }
-                        },
-                        err => {
+                )
+            }
 
-                        }
-                    )
+        },
+        /**
+         * 查询最小单元列表
+         * */
+        findUnit() {
+            if (this.unitList.length == 0) {
+                let requestData = {
+                    code: this.$store.state.userInfo.TEAMModelId
                 }
-
-            },
-            /**
-             * 查询最小单元列表
-             * */
-            findUnit() {
-                if (this.unitList.length == 0) {
-                    let requestData = {
-                        code: this.$store.state.userInfo.TEAMModelId
-                    }
-                    this.$api.learnActivity.FindUnit(requestData).then(
-                        res => {
-                            if (!res.error) {
-                                this.unitList = res.units
-                            } else {
-                                this.$Message.error('API ERROR!')
-                            }
-                        },
-                        err => {
+                this.$api.learnActivity.FindUnit(requestData).then(
+                    res => {
+                        if (!res.error) {
+                            this.unitList = res.units
+                        } else {
                             this.$Message.error('API ERROR!')
                         }
-                    )
-                }
-
+                    },
+                    err => {
+                        this.$Message.error('API ERROR!')
+                    }
+                )
             }
-        },
-        created() {
-            //this.findOrderLearn()
-            this.isLoading = true
-            this.findUnit()
-            this.findClassroom()
+
         }
+    },
+    created() {
+        //this.findOrderLearn()
+        this.isLoading = true
+        this.findUnit()
+        this.findClassroom()
     }
+}
 </script>
 <style lang="less" scoped>
-    @import "./SelfLearn.less";
+@import "./SelfLearn.less";
 </style>
-<style>
-    .order-learn-content-wrap #loadingBox {
-        margin-top: 88px !important;
-    }
+<style lang="less">
+.order-learn-content-wrap #loadingBox {
+    margin-top: 88px !important;
+}
 
-    .publish-modal .ivu-picker-confirm-time {
-        color: #515a6e;
-    }
+.publish-modal .ivu-picker-confirm-time {
+    color: #515a6e;
+}
 
-    .order-learn-list-box .ivu-tabs-content {
-        height: 100%;
+.order-learn-list-box .ivu-tabs-content {
+    height: 100%;
+}
+.sort-dropdown {
+    .title {
+        color: white;
+        font-size: 14px;
+    }
+    .ivu-select-dropdown {
+        background-color: #2d2d2d;
+        border-radius: 2px;
+        border: 1px #464646 solid;
+        .ivu-dropdown-menu {
+            li {
+                color: #ccc;
+                font-size: 12px !important;
+                &:hover {
+                    color: #2d2d2d;
+                }
+            }
+        }
     }
+}
 </style>

+ 2 - 15
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue

@@ -1,15 +1,5 @@
 <template>
 	<div class="achievement-container">
-		<!--        <Row>
-            <span class="class-info">
-                <Icon type="ios-ribbon" />{{$t('totalAnalysis.ach_text10')}}: <span style="color:#0bdfc4;font-size:16px;margin-right:20px"> {{className}} </span> {{$t('totalAnalysis.ach_text11')}}  <span style="color:#0bdfc4;font-size:20px"> {{ tableData.length }} </span>
-                <span class="class-info-back">
-                    <Button type="primary" @click="goBack">
-                        {{$t('totalAnalysis.ach_text12')}}
-                    </Button>
-                </span>
-            </span>
-        </Row> -->
 		<Row>
 			<span class="component-title" style="margin-top:40px">{{ this.$t('totalAnalysis.classBaseInfo') }}</span>
 		</Row>
@@ -239,16 +229,13 @@
 						itemsColumns.push({
 							title: '题目' + (index + 1),
 							key: 's' + (index + 1),
-							render:null,
-							sortable: "custom",
 							minWidth:100
 						})
 					})
 					this.earlyPercentColumns.splice(5,this.earlyPercentColumns.length - 5,...itemsColumns)
+				}else{
+					this.earlyPercentColumns.splice(5,this.earlyPercentColumns.length - 5)
 				}
-				console.log(this.earlyPercentColumns)
-				
-				
 				return result
 			},
 			

+ 268 - 397
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -1,323 +1,177 @@
 <template>
-    <div class="question-list-container" ref="questionContainer">
-        <!-- 左侧题目列表清单 -->
-        <div class="ql-left-box">
-            <!--<p style="font-size:28px;text-align:center;margin:20px 0">芳草小学2019年5月期中考试数学试卷</p>
+	<div class="question-list-container" ref="questionContainer">
+		<!-- 左侧题目列表清单 -->
+		<div class="ql-left-box">
+			<!--<p style="font-size:28px;text-align:center;margin:20px 0">芳草小学2019年5月期中考试数学试卷</p>
             <p style="font-size:16px;text-align:center">考试时间:120分钟&nbsp;&nbsp;&nbsp;出卷人:张纪中</p>-->
 
-            <!-- <span class="btn-back" @click="handleBackTo" ref="btnBack"><Icon type="ios-arrow-back" />{{$t('totalAnalysis.ql_text13')}}</span> -->
-            <Loading :top="300" v-show="dataLoading" type="3"></Loading>
-			<ExerciseList :propsList="questionList" :examScope="examScope" isAnalysis  @pageScroll="doScroll" ref="exList" isShowAnalysis></ExerciseList>
-        </div>
+			<!-- <span class="btn-back" @click="handleBackTo" ref="btnBack"><Icon type="ios-arrow-back" />{{$t('totalAnalysis.ql_text13')}}</span> -->
+			<Loading :top="300" v-show="dataLoading" type="3"></Loading>
+			<ExerciseList :propsList="questionList" :flatIds="flatList.length ? flatList.map(i => i.id) : []" :examScope="examScope"
+			 :analysisJson="paperAnalysisJson" :optionRate="paperOptionRateArr" isAnalysis
+				@pageScroll="doScroll" ref="exList" isShowAnalysis></ExerciseList>
+		</div>
 
-        <!-- 右侧题目列表题型概览 -->
-        <div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
-			<Button type="info" @click="handleBackTo" style="width: 100%;height: 50px;margin-bottom: 15px;border-radius: 0;">返回上级</Button>
+		<!-- 右侧题目列表题型概览 -->
+		<div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
+			<Button type="info" @click="handleBackTo"
+				style="width: 100%;height: 50px;margin-bottom: 15px;border-radius: 0;">{{ $t('totalAnalysis.backUp')}}</Button>
 			<div style="background-color: #fff;">
 				<div class="ql-right-score">
-					<p style="margin-top: 20px;">试卷科目:{{ $store.state.totalAnalysis.currentSubject }}</p>
-					<p style="margin-top: 10px;">试卷题数:{{ questionList.length }}</p>
-				    <p style="margin-top: 10px;">{{$t('totalAnalysis.ql_text1')}} :<span>{{sumArr(questionList.map(item => item.score))}} {{$t('totalAnalysis.ql_text8')}}</span></p> 
+					<p style="margin-top: 20px;">{{ $t('totalAnalysis.paperSubject')}}:{{ $store.state.totalAnalysis.currentSubject }}</p>
+					<p style="margin-top: 10px;">{{ $t('totalAnalysis.paperItemsCount')}}:{{ questionList.length }}</p>
+					<p style="margin-top: 10px;">{{$t('totalAnalysis.ql_text1')}}
+						:<span>{{sumArr(questionList.map(item => item.score))}} {{$t('totalAnalysis.ql_text8')}}</span>
+					</p>
 				</div>
-				
+
 				<div class="ql-right-list">
-				        <div>
-				            <div class="ql-right-part" v-if="SingleList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-				                    <span class="ql-right-item" v-for="(item,index) in SingleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-				                </div>
-				            </div>
-				            <div class="ql-right-part" v-if="MultipleList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-				                    <span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-				                </div>
-				            </div>
-				            <div class="ql-right-part" v-if="JudgeList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-				                    <span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-				                </div>
-				            </div>
-				            <div class="ql-right-part" v-if="CompleteList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-				                    <span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-				                </div>
-				            </div>
-				            <div class="ql-right-part" v-if="SubjectiveList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-				                    <span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-				                </div>
-				            </div>
-							<div class="ql-right-part" v-if="ConnectorList.length">
-							    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text14')}}({{sumArr(ConnectorList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-							    <div class="ql-right-items">
-							        <span class="ql-right-item" v-for="(item,index) in ConnectorList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-							    </div>
+					<div>
+						<div class="ql-right-part" v-if="SingleList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text2')}}({{sumArr(SingleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in SingleList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							</div>
+						</div>
+						<div class="ql-right-part" v-if="MultipleList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text3')}}({{sumArr(MultipleList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in MultipleList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							</div>
+						</div>
+						<div class="ql-right-part" v-if="JudgeList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text4')}}({{sumArr(JudgeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in JudgeList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							</div>
+						</div>
+						<div class="ql-right-part" v-if="CompleteList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text5')}}({{sumArr(CompleteList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in CompleteList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							</div>
+						</div>
+						<div class="ql-right-part" v-if="SubjectiveList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text6')}}({{sumArr(SubjectiveList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in SubjectiveList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
 							</div>
-							<div class="ql-right-part" v-if="CorrectList.length">
-							    <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text15')}}({{sumArr(CorrectList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-							    <div class="ql-right-items">
-							        <span class="ql-right-item" v-for="(item,index) in CorrectList" :key="index" @click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"  :data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
-							    </div>
+						</div>
+						<div class="ql-right-part" v-if="ConnectorList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text14')}}({{sumArr(ConnectorList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in ConnectorList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
 							</div>
-				            <div class="ql-right-part" v-if="ComposeList.length">
-				                <span class="ql-right-part-title"><span class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
-				                <div class="ql-right-items">
-									<!-- 如果是综合题 则需要把小题题序放出来 -->
-									<span v-for="(item,index) in ComposeList" :key="index" style="background-color: none;" class="ql-right-items">
-										<span class="ql-right-item" v-for="(child,childIndex) in item.children" :key="childIndex" @click="handleItemClick(item,$event)" :ref="'indexRef' + (flatList.indexOf(child))"  :data-order="flatList.indexOf(child)">{{ fillIndexOrder(flatList.indexOf(child)) }} ({{getIndexOrder(item)}} - {{ childIndex + 1 }})</span>
-									</span>
-				                </div>
-				            </div>
-				        </div>
+						</div>
+						<div class="ql-right-part" v-if="CorrectList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text15')}}({{sumArr(CorrectList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<span class="ql-right-item" v-for="(item,index) in CorrectList" :key="index"
+									@click="handleItemClick(item,$event)" :ref="'indexRef' + flatList.indexOf(item)"
+									:data-order="flatList.indexOf(item)">{{getIndexOrder(item)}}</span>
+							</div>
+						</div>
+						<div class="ql-right-part" v-if="ComposeList.length">
+							<span class="ql-right-part-title"><span
+									class="ql-line"></span>{{$t('totalAnalysis.ql_text7')}}({{sumArr(ComposeList.map(item => item.score))}}{{$t('totalAnalysis.ql_text8')}})</span>
+							<div class="ql-right-items">
+								<!-- 如果是综合题 则需要把小题题序放出来 -->
+								<span v-for="(item,index) in ComposeList" :key="index" style="background-color: none;"
+									class="ql-right-items">
+									<span class="ql-right-item" v-for="(child,childIndex) in item.children"
+										:key="childIndex" @click="handleItemClick(item,$event)"
+										:ref="'indexRef' + (flatList.indexOf(child))"
+										:data-order="flatList.indexOf(child)">{{ fillIndexOrder(flatList.indexOf(child)) }}
+										({{getIndexOrder(item)}} - {{ childIndex + 1 }})</span>
+								</span>
+							</div>
+						</div>
+					</div>
 				</div>
 			</div>
-            
-        </div>
-    </div>
+
+		</div>
+	</div>
 </template>
 
 <script>
-    import BaseLine from '@/components/student-analysis/total/BaseLine.vue'
-    import BaseRateLine from '@/components/student-analysis/total/BaseRateLine.vue'
-    import ExerciseList from '@/components/evaluation/ExerciseList.vue'
-    export default {
-        components: {
-            BaseRateLine, BaseLine,ExerciseList
-        },
-        data() {
-            return {
-				examScope:null,
-                dataLoading: false,
-				isOpen:true,
-                activeCollapseIndex: [],
-                isFixed: false,
-                isLoadingEcharts: false,
-                isShowAnswerExplain: false,
-                tableData: [],
-                optionsData: [],
-                collapseList: [],
-                questionList: [],
-				flatList:[],
-                SingleList: [],
-                MultipleList: [],
-                JudgeList: [],
-                CompleteList: [],
-                SubjectiveList: [],
-                ConnectorList: [],
-                CorrectList: [],
-                ComposeList: [],
-                diffColors: ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'],
-                dataColumns: [
-                    {
-                        title: '知识点',
-                        key: 'knowledgePoint',
-                        align: 'center',
-                        width: 150
-                    },
-                    {
-                        title: '落点区域',
-                        key: 'areaName',
-                        align: 'center'
-                    },
-                    {
-                        title: '配分',
-                        key: 'score',
-                        align: 'center'
-                    },
-                    {
-                        title: '难易度',
-                        key: 'diff',
-                        align: 'center'
-                    },
-                    {
-                        title: '鉴别度',
-                        key: 'identify',
-                        align: 'center',
-                        render: function (h, params) {
-                            return h('span', (Number(params.row.identify)).toFixed(2))
-                        }
-                    },
-                    {
-                        title: '正答率',
-                        align: 'center',
-                        key: 'classScoreRate'
-                    },
-                    {
-                        title: '高分组正答率',
-                        align: 'center',
-                        key: 'PH',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.PH)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: '低分组正答率',
-                        align: 'center',
-                        key: 'PL',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.PL)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R1',
-                        align: 'center',
-                        key: 'R1',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R1)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R2',
-                        key: 'R2',
-                        align: 'center',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R2)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R3',
-                        align: 'center',
-                        key: 'R3',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R3)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R4',
-                        align: 'center',
-                        key: 'R4',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R4)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R5',
-                        align: 'center',
-                        key: 'R5',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R5)) * 100).toFixed(0) + '%')
-                        }
-                    },
-                    {
-                        title: 'R6',
-                        align: 'center',
-                        key: 'R6',
-                        render: function (h, params) {
-                            return h('span', ((Number(params.row.R6)) * 100).toFixed(0) + '%')
-                        }
-                    }
-                ],
-                optionColumns: [
-                    {
-                        title: '选项',
-                        key: 'option',
-                        align: 'center',
-                        width: 150
-                    },
-                    {
-                        title: '选答人数',
-                        key: 'num',
-                        align: 'center'
-                    },
-                    {
-                        title: '选答率',
-                        key: 'rate',
-                        align: 'center',
-                        render: (h, params) => {
-                            return h('div', [
-                                h('Progress', {
-                                    props: {
-                                        percent: params.row.rate,
-                                        strokeColor: params.row.isTrue ? '#14db14' : '#b5bcbe'
-                                    }
-                                })
-                            ])
-                        }
-                    },
-                    {
-                        title: '高分组选答率',
-                        align: 'center',
-                        key: 'PH',
-                        render: function (h, params) {
-                            return h('span', params.row.PH + '%')
-                        }
-                    },
-                    {
-                        title: '低分组选答率',
-                        align: 'center',
-                        key: 'PL',
-                        render: function (h, params) {
-                            return h('span', params.row.PL + '%')
-                        }
-                    }
-                ],
-                scrollTop: 0,
-                fromRoutePath: null
+	import BaseLine from '@/components/student-analysis/total/BaseLine.vue'
+	import BaseRateLine from '@/components/student-analysis/total/BaseRateLine.vue'
+	import ExerciseList from '@/components/evaluation/ExerciseList.vue'
+	export default {
+		components: {
+			BaseRateLine,
+			BaseLine,
+			ExerciseList
+		},
+		data() {
+			return {
+				examScope: null,
+				dataLoading: false,
+				isOpen: true,
+				activeCollapseIndex: [],
+				isFixed: false,
+				isLoadingEcharts: false,
+				isShowAnswerExplain: false,
+				tableData: [],
+				optionsData: [],
+				collapseList: [],
+				questionList: [],
+				flatList: [],
+				SingleList: [],
+				MultipleList: [],
+				JudgeList: [],
+				CompleteList: [],
+				SubjectiveList: [],
+				ConnectorList: [],
+				CorrectList: [],
+				ComposeList: [],
+				diffColors: ['#32CF74', '#E8BE15', '#F19300', '#EB5E00', '#D30000'],
+				scrollTop: 0,
+				fromRoutePath: null,
+				paperAnalysisJson: [],
+				paperOptionRateArr:[]
+			}
+		},
+		created() {
+			let that = this
+			let parentVm = this.$parent.$parent.$parent
+			parentVm.isShowQuestions = true
 
-            }
-        },
-        created() {
-            let that = this
-            let parentVm = this.$parent.$parent.$parent
-            parentVm.isShowQuestions = true
-			
 			let curExam = JSON.parse(localStorage.getItem('curExam'))
 			let curSubjectIndex = curExam.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
 			console.log(curSubjectIndex)
-			console.log('当前的评测数据',curExam)
+			console.log('当前的评测数据', curExam)
 			this.examScope = curExam.scope
-			console.log('dangqia',this.examScope)
 			let curPaper = curExam.papers[curSubjectIndex]
-			this.initFullPaper(curPaper,curExam)
+			this.initFullPaper(curPaper, curExam)
+		},
 
-            
-            this.optionsData = [
-                {
-                    option: 'A',
-                    isTrue: false,
-                    num: 12,
-                    rate: 40,
-                    PH: 10,
-                    PL: 60
-                },
-                {
-                    option: 'B',
-                    isTrue: false,
-                    num: 6,
-                    rate: 20,
-                    PH: 10,
-                    PL: 23
-                },
-                {
-                    option: 'C',
-                    isTrue: true,
-                    num: 9,
-                    rate: 30,
-                    PH: 70,
-                    PL: 10
-                },
-                {
-                    option: 'D',
-                    isTrue: false,
-                    num: 3,
-                    rate: 10,
-                    PH: 10,
-                    PL: 7
-                }
-            ]
-        },
+		methods: {
 
-        methods: {
-			
-			async initFullPaper(examPaper,exam){
+			async initFullPaper(examPaper, exam) {
 				console.log(examPaper.name)
-				examPaper.examId = exam.code.replace('Exam-','')
-				let fullPaperJson =  await this.$evTools.getFullPaper(examPaper,exam.scope)
+				examPaper.examId = exam.code.replace('Exam-', '')
+				let fullPaperJson = await this.$evTools.getFullPaper(examPaper, exam.scope)
 				this.questionList = fullPaperJson.item
 				this.SingleList = this.questionList.filter(item => item.type === 'single')
 				this.MultipleList = this.questionList.filter(item => item.type === 'multiple')
@@ -328,8 +182,8 @@
 				this.CorrectList = this.questionList.filter(item => item.type === 'correct')
 				this.ComposeList = this.questionList.filter(item => item.type === 'compose')
 				this.dataLoading = false
-				console.log('当前的评测试卷数据',fullPaperJson)
-				
+				console.log('当前的评测试卷数据', fullPaperJson)
+
 				// 如果是试题页面过来带有题序 则获取指定题目并进行滚动
 				let qIndex = this.$route.query.QIndex
 				if (qIndex) {
@@ -339,13 +193,14 @@
 						allItems = allItems.concat(i.type === 'compose' ? i.children : [i])
 					})
 					this.flatList = allItems
-					console.log('拉平后的题目',allItems)
+					console.log('拉平后的题目', allItems)
 					// 获取当前试题的分析数据
-					// let itemAnalysisArr = this.getExerciseList()
+					this.paperAnalysisJson = this.getExerciseList()
 					this.$nextTick(() => {
 						console.log(this.$refs['indexRef' + (qIndex - 1)][0])
 						setTimeout(() => {
-							this.$refs['indexRef' + (qIndex - 1)][0].click() // 根据路由携带的题序 来触发对应题序的点击事件 完成滚动
+							this.$refs['indexRef' + (qIndex - 1)][0]
+							.click() // 根据路由携带的题序 来触发对应题序的点击事件 完成滚动
 						}, 1000)
 					})
 				} else {
@@ -355,8 +210,13 @@
 				}
 			},
 			
+			// 获取当前试卷试题的选答率数据
+			getOptionRate(subjectIndex){
+				
+			},
+
 			/* 页面滚动逻辑 */
-			doScroll(scrollDistance){
+			doScroll(scrollDistance) {
 				this.$nextTick(() => {
 					let parentVm = this.$parent.$parent.$parent
 					parentVm.$refs['vs'].scrollTo({
@@ -367,79 +227,79 @@
 					);
 				})
 			},
-			
-            // 指定容器滚动到指定位置
-            scrollToTop(element, to, duration) {
-                if (duration <= 0) return
-                const diff = to - element.scrollTop
-                const perTick = diff / duration * 10
-                this.timer = setTimeout(() => {
-                    element.scrollTop += perTick
-                    if (element.scrollTop === to) return
-                    this.scrollToTop(element, to, duration - 10)
-                }, 10)
-            },
 
-            // 点击右边题序 获取到题目DOM 进行滚动操作
-            handleItemClick(item, e) {
+			// 指定容器滚动到指定位置
+			scrollToTop(element, to, duration) {
+				if (duration <= 0) return
+				const diff = to - element.scrollTop
+				const perTick = diff / duration * 10
+				this.timer = setTimeout(() => {
+					element.scrollTop += perTick
+					if (element.scrollTop === to) return
+					this.scrollToTop(element, to, duration - 10)
+				}, 10)
+			},
+
+			// 点击右边题序 获取到题目DOM 进行滚动操作
+			handleItemClick(item, e) {
 				console.log(e)
 				this.$nextTick(() => {
 					let parentVm = this.$parent.$parent.$parent
 					let currentSpan = e.target || e
 					let allList = document.getElementsByClassName('ql-right-item')
-					let questionList = this.$refs.exList.$el.getElementsByClassName('exercise-item')
+					let questionList = this.$refs.exList.$el.getElementsByClassName('cp-exercise-item')
 					let itemIndex = this.questionList.indexOf(item)
 					let questionDom = questionList[itemIndex]
 					questionDom.style.border = '2px solid #2db7f5'
 					setTimeout(() => {
 						questionDom.style.border = '2px solid transparent'
-					},2000)
+					}, 2000)
 					this.doScroll(questionDom.offsetTop)
 					// 伪数组处理统一背景颜色
 					Array.prototype.slice.call(allList).forEach(item => {
-					    item.style.background = '#2db7f5'
+						item.style.background = '#2db7f5'
 					})
 					// 将当前选中项修改选中色
 					currentSpan.style.background = '#139c51'
 					this.$refs.exList.collapseList = [itemIndex]
 				})
-                
-            },
 
-            // 点击返回
-            handleBackTo() {
-                // this.$refs.btnBack.style.display = 'none'
-                this.$parent.$parent.$parent.isShowQuestions = false
-                this.$router.back(-1)
-            },
+			},
+
+			// 点击返回
+			handleBackTo() {
+				// this.$refs.btnBack.style.display = 'none'
+				this.$parent.$parent.$parent.isShowQuestions = false
+				this.$router.back(-1)
+			},
 
-            // 折叠面板点击事件
-            handleCollapseChange(val) {
-                let questionIndex = val[0]
-                if (questionIndex === '999') return
-                if (questionIndex && this.collapseList.indexOf(questionIndex) === -1) {
-                    this.collapseList.push(questionIndex)
-                    this.activeCollapseIndex = questionIndex
-                } else if (questionIndex === 0) {
-                    this.collapseList.push(questionIndex)
-                    this.activeCollapseIndex = questionIndex
-                } else {
-                    // console.log("加入异常", questionIndex);
-                    // console.log("加入异常", this.collapseList.indexOf(questionIndex));
-                }
-                this.activeCollapseIndex = this.collapseList
-            },
+			// 折叠面板点击事件
+			handleCollapseChange(val) {
+				let questionIndex = val[0]
+				if (questionIndex === '999') return
+				if (questionIndex && this.collapseList.indexOf(questionIndex) === -1) {
+					this.collapseList.push(questionIndex)
+					this.activeCollapseIndex = questionIndex
+				} else if (questionIndex === 0) {
+					this.collapseList.push(questionIndex)
+					this.activeCollapseIndex = questionIndex
+				} else {
+					// console.log("加入异常", questionIndex);
+					// console.log("加入异常", this.collapseList.indexOf(questionIndex));
+				}
+				this.activeCollapseIndex = this.collapseList
+			},
 
-            // 返回题目区域总分 字符串换算
-            sumArr(arr) {
-				if(arr.length){
-					return arr.reduce((a,b) => a + b)
-				}else{
+			// 返回题目区域总分 字符串换算
+			sumArr(arr) {
+				if (arr.length) {
+					return arr.reduce((a, b) => a + b)
+				} else {
 					return 0
 				}
-                
-            },
-			
+
+			},
+
 			/* 获取所有试题的对应分析数据 */
 			getExerciseList() {
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
@@ -451,81 +311,92 @@
 					analysisJson.paperKey.forEach((key, index) => {
 						obj[key] = exercise[index]
 					})
-			
+
 					analysisJson.classes.forEach(classItem => {
 						obj[classItem.className] = classItem.subjects[curSubjectIndex].item[exerciseIndex]
 					})
 					result.push(obj)
 				})
+				
+				let curSubject = analysisJson.subjects[curSubjectIndex]
+				curSubject.record.forEach((i,itemIndex) => {
+					this.paperOptionRateArr.push({
+						record:curSubject.record[itemIndex],
+						ph:curSubject.phc[itemIndex],
+						pl:curSubject.plc[itemIndex]
+					})
+				})
+				
 				return result
 			},
-        },
+		},
 
-        mounted() {
+		mounted() {
 			this.$EventBus.$off('onCollapseChange')
-			this.$EventBus.$on('onCollapseChange',val => {
+			this.$EventBus.$on('onCollapseChange', val => {
 				// 如果侧边栏展开的时候
 				this.isOpen = !val
 			})
-			
-			
-			
-			
 
-        },
 
-        computed: {
-            // 获取最新滚动数据
-            getScrollTop() {
-                let top = this.$store.state.totalAnalysis.scrollTop
-                return top
-            },
-            // 获取最新试题数据
-            getAnalysisJson() {
-            	return this.$store.state.totalAnalysis.analysisJson
-            },
+
+
+
+		},
+
+		computed: {
+			// 获取最新滚动数据
+			getScrollTop() {
+				let top = this.$store.state.totalAnalysis.scrollTop
+				return top
+			},
+			// 获取最新试题数据
+			getAnalysisJson() {
+				return this.$store.state.totalAnalysis.analysisJson
+			},
 			// 替换题序
-			getIndexOrder(){
+			getIndexOrder() {
 				return item => {
-					return this.questionList.indexOf(item) + 1 > 9 ? this.questionList.indexOf(item) + 1 : '0' + (this.questionList.indexOf(item) + 1)
+					return this.questionList.indexOf(item) + 1 > 9 ? this.questionList.indexOf(item) + 1 : '0' + (this
+						.questionList.indexOf(item) + 1)
 				}
 			},
 			// 替换题序
-			fillIndexOrder(index){
+			fillIndexOrder(index) {
 				return index => {
 					return index + 1 > 9 ? index + 1 : '0' + (index + 1)
 				}
 			}
-        },
-        watch: {
-            getScrollTop(val) {
-                this.scrollTop = val
-                // let box = this.$refs.rightBox
-                // let btnBack = this.$refs.btnBack
-                // let t = 232 - this.scrollTop
-                // box.style.top = this.scrollTop >= 129 ? '100px' : (t + 'px')
-                // btnBack.style.top = this.scrollTop >= 129 ? (this.scrollTop - 152) + 'px' : '0px'
-            },
-        }
-    }
+		},
+		watch: {
+			getScrollTop(val) {
+				this.scrollTop = val
+				// let box = this.$refs.rightBox
+				// let btnBack = this.$refs.btnBack
+				// let t = 232 - this.scrollTop
+				// box.style.top = this.scrollTop >= 129 ? '100px' : (t + 'px')
+				// btnBack.style.top = this.scrollTop >= 129 ? (this.scrollTop - 152) + 'px' : '0px'
+			},
+		}
+	}
 </script>
 
 <style src="./QuestionList.css" scoped></style>
 
 <style>
-    .ql-item .ivu-collapse {
-        border: 0;
-    }
+	.ql-item .ivu-collapse {
+		border: 0;
+	}
 
-        .ql-item .ivu-collapse > .ivu-collapse-item > .ivu-collapse-header {
-            color: #06a9bb;
-        }
+	.ql-item .ivu-collapse>.ivu-collapse-item>.ivu-collapse-header {
+		color: #06a9bb;
+	}
 
-            .ql-item .ivu-collapse > .ivu-collapse-item > .ivu-collapse-header > .ivu-icon {
-                vertical-align: unset;
-            }
+	.ql-item .ivu-collapse>.ivu-collapse-item>.ivu-collapse-header>.ivu-icon {
+		vertical-align: unset;
+	}
 
-        .ql-item .ivu-collapse > .ivu-collapse-item {
-            border-top: 0;
-        }
+	.ql-item .ivu-collapse>.ivu-collapse-item {
+		border-top: 0;
+	}
 </style>

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

@@ -9,7 +9,7 @@
 						<Icon type="ios-arrow-up" />
 					</div>
 					<!--<Spin fix v-show="contentLoading"></Spin>-->
-					<Loading :top="400" :borderWidth="4" :borderTopWidth="8" v-show="contentLoading" type="2"></Loading>
+					<Loading :top="400" :borderWidth="4" :borderTopWidth="8" v-show="contentLoading"></Loading>
 
 					<div class="basic-info" v-if="!isShowEvaluations && currentExamItem.name">
 						<p style="display: flex;align-items: center;">

+ 4 - 2
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -139,7 +139,7 @@ namespace TEAMModelOS.Controllers.Analysis
                 //获取本次评测所有科目结算结果
                 info = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<ExamInfo>(id.ToString(), new PartitionKey($"Exam-{code}"));
                 School school = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<School>(code.ToString(), new PartitionKey($"Base"));
-                var query = $"select c.id,c.name,c.subjectId,c.studentScores,c.studentIds,c.paper,c.classes,c.sRate,c.average,c.standard,c.lostStus from c where c.examId =  '{id}' ";
+                var query = $"select c.id,c.name,c.subjectId,c.studentScores,c.studentIds,c.paper,c.classes,c.sRate,c.average,c.standard,c.lostStus,c.record,c.phc,c.plc from c where c.examId =  '{id}' ";
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Common").GetItemQueryIterator<ExamResult>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"ExamResult-{id}") }))
                 {
                     examResults.Add(item);
@@ -543,11 +543,13 @@ namespace TEAMModelOS.Controllers.Analysis
                 id = x.id,
                 name = x.name,
                 record = examResults.FirstOrDefault(c => c.id == x.id).record,
+                phc = examResults.FirstOrDefault(c => c.id == x.id).phc,
+                plc = examResults.FirstOrDefault(c => c.id == x.id).plc,
                 sRate = examResults.FirstOrDefault(c => c.id == x.id).sRate,
                 average = examResults.FirstOrDefault(c => c.id == x.id).average,
                 standard = examResults.FirstOrDefault(c => c.id == x.id).standard
             });
-            var subAll = new {sRate = info.sRate, average = info.average ,standard = info.standard };
+            var subAll = new {sRate = info.sRate, average = info.average ,standard = info.standard,total = info.stuCount};
             return Ok(new { students,
                 classes,
                 grades,

+ 113 - 0
TEAMModelOS/Properties/ServiceDependencies/TeammodelOS - Web Deploy/profile.arm.json

@@ -0,0 +1,113 @@
+{
+  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
+  "contentVersion": "1.0.0.0",
+  "metadata": {
+    "_dependencyType": "appService.windows"
+  },
+  "parameters": {
+    "resourceGroupName": {
+      "type": "string",
+      "defaultValue": "TEAMModelChengdu",
+      "metadata": {
+        "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
+      }
+    },
+    "resourceGroupLocation": {
+      "type": "string",
+      "defaultValue": "",
+      "metadata": {
+        "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
+      }
+    },
+    "resourceName": {
+      "type": "string",
+      "defaultValue": "TeammodelOS",
+      "metadata": {
+        "description": "Name of the main resource to be created by this template."
+      }
+    },
+    "resourceLocation": {
+      "type": "string",
+      "defaultValue": "[parameters('resourceGroupLocation')]",
+      "metadata": {
+        "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
+      }
+    }
+  },
+  "variables": {
+    "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
+    "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
+  },
+  "resources": [
+    {
+      "type": "Microsoft.Resources/resourceGroups",
+      "name": "[parameters('resourceGroupName')]",
+      "location": "[parameters('resourceGroupLocation')]",
+      "apiVersion": "2019-10-01"
+    },
+    {
+      "type": "Microsoft.Resources/deployments",
+      "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
+      "resourceGroup": "[parameters('resourceGroupName')]",
+      "apiVersion": "2019-10-01",
+      "dependsOn": [
+        "[parameters('resourceGroupName')]"
+      ],
+      "properties": {
+        "mode": "Incremental",
+        "template": {
+          "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+          "contentVersion": "1.0.0.0",
+          "resources": [
+            {
+              "location": "[parameters('resourceLocation')]",
+              "name": "[parameters('resourceName')]",
+              "type": "Microsoft.Web/sites",
+              "apiVersion": "2015-08-01",
+              "tags": {
+                "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
+              },
+              "dependsOn": [
+                "[variables('appServicePlan_ResourceId')]"
+              ],
+              "kind": "app",
+              "properties": {
+                "name": "[parameters('resourceName')]",
+                "kind": "app",
+                "httpsOnly": true,
+                "reserved": false,
+                "serverFarmId": "[variables('appServicePlan_ResourceId')]",
+                "siteConfig": {
+                  "metadata": [
+                    {
+                      "name": "CURRENT_STACK",
+                      "value": "dotnetcore"
+                    }
+                  ]
+                }
+              },
+              "identity": {
+                "type": "SystemAssigned"
+              }
+            },
+            {
+              "location": "[parameters('resourceLocation')]",
+              "name": "[variables('appServicePlan_name')]",
+              "type": "Microsoft.Web/serverFarms",
+              "apiVersion": "2015-08-01",
+              "sku": {
+                "name": "S1",
+                "tier": "Standard",
+                "family": "S",
+                "size": "S1"
+              },
+              "properties": {
+                "name": "[variables('appServicePlan_name')]"
+              }
+            }
+          ]
+        }
+      }
+    }
+  ]
+}

+ 113 - 0
TEAMModelOS/Properties/ServiceDependencies/teammodelos-dep - Web Deploy/profile.arm.json

@@ -0,0 +1,113 @@
+{
+  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
+  "contentVersion": "1.0.0.0",
+  "metadata": {
+    "_dependencyType": "appService.windows"
+  },
+  "parameters": {
+    "resourceGroupName": {
+      "type": "string",
+      "defaultValue": "TEAMModelChengdu",
+      "metadata": {
+        "description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
+      }
+    },
+    "resourceGroupLocation": {
+      "type": "string",
+      "defaultValue": "",
+      "metadata": {
+        "description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
+      }
+    },
+    "resourceName": {
+      "type": "string",
+      "defaultValue": "dep",
+      "metadata": {
+        "description": "Name of the main resource to be created by this template."
+      }
+    },
+    "resourceLocation": {
+      "type": "string",
+      "defaultValue": "[parameters('resourceGroupLocation')]",
+      "metadata": {
+        "description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
+      }
+    }
+  },
+  "variables": {
+    "appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
+    "appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
+  },
+  "resources": [
+    {
+      "type": "Microsoft.Resources/resourceGroups",
+      "name": "[parameters('resourceGroupName')]",
+      "location": "[parameters('resourceGroupLocation')]",
+      "apiVersion": "2019-10-01"
+    },
+    {
+      "type": "Microsoft.Resources/deployments",
+      "name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
+      "resourceGroup": "[parameters('resourceGroupName')]",
+      "apiVersion": "2019-10-01",
+      "dependsOn": [
+        "[parameters('resourceGroupName')]"
+      ],
+      "properties": {
+        "mode": "Incremental",
+        "template": {
+          "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
+          "contentVersion": "1.0.0.0",
+          "resources": [
+            {
+              "location": "[parameters('resourceLocation')]",
+              "name": "[parameters('resourceName')]",
+              "type": "Microsoft.Web/sites",
+              "apiVersion": "2015-08-01",
+              "tags": {
+                "[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
+              },
+              "dependsOn": [
+                "[variables('appServicePlan_ResourceId')]"
+              ],
+              "kind": "app",
+              "properties": {
+                "name": "[parameters('resourceName')]",
+                "kind": "app",
+                "httpsOnly": true,
+                "reserved": false,
+                "serverFarmId": "[variables('appServicePlan_ResourceId')]",
+                "siteConfig": {
+                  "metadata": [
+                    {
+                      "name": "CURRENT_STACK",
+                      "value": "dotnetcore"
+                    }
+                  ]
+                }
+              },
+              "identity": {
+                "type": "SystemAssigned"
+              }
+            },
+            {
+              "location": "[parameters('resourceLocation')]",
+              "name": "[variables('appServicePlan_name')]",
+              "type": "Microsoft.Web/serverFarms",
+              "apiVersion": "2015-08-01",
+              "sku": {
+                "name": "S1",
+                "tier": "Standard",
+                "family": "S",
+                "size": "S1"
+              },
+              "properties": {
+                "name": "[variables('appServicePlan_name')]"
+              }
+            }
+          ]
+        }
+      }
+    }
+  ]
+}

+ 4 - 3
TEAMModelOS/appsettings.Development.json

@@ -26,9 +26,10 @@
       "Container": "teammodelos"
     },
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;",
-      "Database": [ "TEAMModelOS" ],
-      "ScanModel": [ "TEAMModelOS" ]
+      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"
+    },
+    "CosmosDep": {
+      "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
     },
     "Redis": {
       "ConnectionString": "CoreRedisCN.redis.cache.chinacloudapi.cn:6380,password=LyJWP1ORJdv+poXWofAF97lhCEQPg1wXWqvtzXGXQuE=,ssl=True,abortConnect=False"

+ 4 - 1
TEAMModelOS/appsettings.json

@@ -27,7 +27,10 @@
       "Container": "teammodelos"
     },
     "Cosmos": {
-      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"     
+      "ConnectionString": "AccountEndpoint=https://teammodelos.documents.azure.cn:443/;AccountKey=clF73GwPECfP1lKZTCvs8gLMMyCZig1HODFbhDUsarsAURO7TcOjVz6ZFfPqr1HzYrfjCXpMuVD5TlEG5bFGGg==;"
+    },
+    "CosmosDep": {
+      "ConnectionString": "AccountEndpoint=https://cdhabookdep-free.documents.azure.cn:443/;AccountKey=JTUVk92Gjsx17L0xqxn0X4wX2thDPMKiw4daeTyV1HzPb6JmBeHdtFY1MF1jdctW1ofgzqkDMFOtcqS46by31A==;"
     },
     "Redis": {
       "ConnectionString": "CoreRedisCN.redis.cache.chinacloudapi.cn:6380,password=LyJWP1ORJdv+poXWofAF97lhCEQPg1wXWqvtzXGXQuE=,ssl=True,abortConnect=False"