Browse Source

HiTeach API 取得學生名單:追加分組訊息

jeff 4 years ago
parent
commit
0e29e844c3
100 changed files with 4623 additions and 4412 deletions
  1. 7 4
      TEAMModelFunction/TriggerSurvey.cs
  2. 5 2
      TEAMModelFunction/TriggerVote.cs
  3. 2 0
      TEAMModelOS.SDK/Models/Cosmos/Common/Inner/BaseItem.cs
  4. 44 0
      TEAMModelOS.SDK/Models/Cosmos/Common/JoinList.cs
  5. 2 2
      TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs
  6. 2 2
      TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs
  7. 3 3
      TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs
  8. 6 2
      TEAMModelOS/ClientApp/src/api/courseMgmt.js
  9. 0 293
      TEAMModelOS/ClientApp/src/common/BaseExamList.vue
  10. 92 0
      TEAMModelOS/ClientApp/src/common/BasePdSelect.vue
  11. 12 5
      TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue
  12. 3 5
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue
  13. 8 4
      TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue
  14. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseBar.vue
  15. 1 0
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseEntryBar.vue
  16. 3 3
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseKnowledgeDetail.vue
  17. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelPie.vue
  18. 3 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue
  19. 34 25
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue
  20. 1 1
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BasePie.vue
  21. 4 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseRadar.vue
  22. 0 2
      TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseScatter.vue
  23. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/EventView/BillBoardandLightBox.vue
  24. 2 4
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue
  25. 10 13
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue
  26. 2 2
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/completePaper.vue
  27. 12 6
      TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/composePaper.vue
  28. 1 1
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/HomeView.vue
  29. 0 5
      TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue
  30. 4 4
      TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue
  31. 226 193
      TEAMModelOS/ClientApp/src/css/site.css
  32. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js
  33. 351 385
      TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js
  34. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js
  35. 2 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/index.js
  36. 58 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/knowledge.js
  37. 405 394
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js
  38. 8 7
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js
  39. 3 1
      TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js
  40. 19 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js
  41. 2 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js
  42. 58 0
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js
  43. 440 419
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js
  44. 9 8
      TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js
  45. 0 1
      TEAMModelOS/ClientApp/src/router/routes.js
  46. 14 3
      TEAMModelOS/ClientApp/src/utils/evTools.js
  47. 9 4
      TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue
  48. 114 76
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue
  49. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseCreateChild.vue
  50. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseEditExercise.vue
  51. 8 4
      TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue
  52. 1 1
      TEAMModelOS/ClientApp/src/view/evaluation/index/CreateExercises.vue
  53. 3 3
      TEAMModelOS/ClientApp/src/view/evaluation/types/BaseCompletion.vue
  54. 54 59
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue
  55. 6 6
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/AddBlock.vue
  56. 5 31
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/AddPoint.vue
  57. 10 11
      TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/ComposeBlock.vue
  58. 7 4
      TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue
  59. 4 1
      TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue
  60. 3 3
      TEAMModelOS/ClientApp/src/view/learnactivity/PrivScoring.vue
  61. 100 0
      TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.less
  62. 461 0
      TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.vue
  63. 8 3
      TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.less
  64. 172 376
      TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.vue
  65. 1 28
      TEAMModelOS/ClientApp/src/view/newcourse/CourseTime.vue
  66. 1 0
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.less
  67. 4 4
      TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue
  68. 4 4
      TEAMModelOS/ClientApp/src/view/newcourse/NewCusMgt.vue
  69. 9 17
      TEAMModelOS/ClientApp/src/view/newcourse/TeaTable.vue
  70. 36 30
      TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue
  71. 0 129
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.css
  72. 108 0
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.less
  73. 6 35
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue
  74. 32 32
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue
  75. 31 20
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue
  76. 16 6
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less
  77. 155 279
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.vue
  78. 1 33
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.css
  79. 3 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue
  80. 4 5
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue
  81. 1 32
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.css
  82. 2 10
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.vue
  83. 17 15
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue
  84. 1 8
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.css
  85. 35 24
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue
  86. 1 2
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css
  87. 69 62
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue
  88. 1 8
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css
  89. 341 342
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue
  90. 37 16
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less
  91. 443 320
      TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.vue
  92. 50 45
      TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue
  93. 1 1
      TEAMModelOS/Controllers/Analysis/AnalysisController.cs
  94. 1 1
      TEAMModelOS/Controllers/Client/HiTeachController.cs
  95. 1 1
      TEAMModelOS/Controllers/Common/ExamController.cs
  96. 0 187
      TEAMModelOS/Controllers/Common/SurveyController.cs
  97. 0 123
      TEAMModelOS/Controllers/Common/VoteController.cs
  98. 172 141
      TEAMModelOS/Controllers/School/ClassRoomController.cs
  99. 173 47
      TEAMModelOS/Controllers/School/CourseController.cs
  100. 0 0
      TEAMModelOS/Services/Common/ActivityStudentService.cs

+ 7 - 4
TEAMModelFunction/TriggerSurvey.cs

@@ -30,12 +30,15 @@ namespace TEAMModelFunction
             }
             }
             var adid = tdata.id;
             var adid = tdata.id;
             var adcode = "";
             var adcode = "";
+            string blobcntr = null;
             if (tdata.scope == "school")
             if (tdata.scope == "school")
             {
             {
                   adcode = $"Activity-{tdata.school}";
                   adcode = $"Activity-{tdata.school}";
+                blobcntr = tdata.school;
             }
             }
             else if (tdata.scope == "private"){
             else if (tdata.scope == "private"){
                 adcode = $"Activity-{tdata.creatorId}";
                 adcode = $"Activity-{tdata.creatorId}";
+                 blobcntr = tdata.creatorId;
             }
             }
             ActivityData data = null;
             ActivityData data = null;
             try
             try
@@ -159,9 +162,9 @@ namespace TEAMModelFunction
                         }
                         }
                         var cods = new { records = recs, userids };
                         var cods = new { records = recs, userids };
                         //问卷整体情况
                         //问卷整体情况
-                        await _azureStorage.UploadFileByContainer(survey.blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
+                        await _azureStorage.UploadFileByContainer(blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
                         //结算每道题的答题情况
                         //结算每道题的答题情况
-                        var ContainerClient =  _azureStorage.GetBlobContainerClient(survey.blobcntr);
+                        var ContainerClient =  _azureStorage.GetBlobContainerClient(blobcntr);
                         List<Task<string>> tasks = new List<Task<string>>();
                         List<Task<string>> tasks = new List<Task<string>>();
                         //获取
                         //获取
                         try {
                         try {
@@ -169,7 +172,7 @@ namespace TEAMModelFunction
                             List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
                             List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
                             foreach (string item in items)
                             foreach (string item in items)
                             {
                             {
-                                var Download = await _azureStorage.GetBlobContainerClient(survey.blobcntr).GetBlobClient(item).DownloadAsync();
+                                var Download = await _azureStorage.GetBlobContainerClient(blobcntr).GetBlobClient(item).DownloadAsync();
                                 var json = await JsonDocument.ParseAsync(Download.Value.Content);
                                 var json = await JsonDocument.ParseAsync(Download.Value.Content);
                                 var Record = json.RootElement.ToObject<SurveyRecord>();
                                 var Record = json.RootElement.ToObject<SurveyRecord>();
                                 surveyRecords.Add(Record);
                                 surveyRecords.Add(Record);
@@ -213,7 +216,7 @@ namespace TEAMModelFunction
                                         }
                                         }
                                     }
                                     }
                                 }
                                 }
-                                tasks.Add(  _azureStorage.UploadFileByContainer(survey.blobcntr, question.ToJsonString(), "survey", url));
+                                tasks.Add(  _azureStorage.UploadFileByContainer(blobcntr, question.ToJsonString(), "survey", url));
                             }
                             }
                             await Task.WhenAll(tasks);
                             await Task.WhenAll(tasks);
                         } catch (Exception ex) {
                         } catch (Exception ex) {

+ 5 - 2
TEAMModelFunction/TriggerVote.cs

@@ -28,13 +28,16 @@ namespace TEAMModelFunction
             }
             }
             var adid = tdata.id;
             var adid = tdata.id;
             var adcode = "";
             var adcode = "";
+            string blobcntr = null;
             if (tdata.scope == "school")
             if (tdata.scope == "school")
             {
             {
                 adcode = $"Activity-{tdata.school}";
                 adcode = $"Activity-{tdata.school}";
+                blobcntr = tdata.school;
             }
             }
             else if (tdata.scope == "private")
             else if (tdata.scope == "private")
             {
             {
                 adcode = $"Activity-{tdata.creatorId}";
                 adcode = $"Activity-{tdata.creatorId}";
+                blobcntr = tdata.creatorId;
             }
             }
             ActivityData data = null;
             ActivityData data = null;
             try
             try
@@ -168,11 +171,11 @@ namespace TEAMModelFunction
                         var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
                         var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
                         foreach (var g in gp)
                         foreach (var g in gp)
                         {
                         {
-                            tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
+                            tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
                         }
                         }
                         //处理活动方的记录, 
                         //处理活动方的记录, 
                         string url = $"/vote/{vote.id}/record.json";
                         string url = $"/vote/{vote.id}/record.json";
-                        tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, new { options = countcds, records = recordsBlob }.ToJsonString(), "vote", $"{vote.id}/record.json"));
+                        tasks.Add(_azureStorage.UploadFileByContainer(blobcntr, new { options = countcds, records = recordsBlob }.ToJsonString(), "vote", $"{vote.id}/record.json"));
                         //处理投票者的记录
                         //处理投票者的记录
 
 
                         if (string.IsNullOrEmpty(vote.recordUrl))
                         if (string.IsNullOrEmpty(vote.recordUrl))

+ 2 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/Inner/BaseItem.cs

@@ -7,6 +7,8 @@ namespace TEAMModelOS.SDK.Models.Cosmos.Common.Inner
 {
 {
     public class BaseItem  : CosmosEntity
     public class BaseItem  : CosmosEntity
     {
     {
+        // 填空数量  
+        public int blankCount { get; set; }
         public bool objective { get; set; }
         public bool objective { get; set; }
         public string shaCode { get; set; }
         public string shaCode { get; set; }
         // 选项 单选 多选 判断
         // 选项 单选 多选 判断

+ 44 - 0
TEAMModelOS.SDK/Models/Cosmos/Common/JoinList.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace TEAMModelOS.SDK.Models.Cosmos.Common
+{
+
+    /*
+     * {
+            "id": "28936",
+            "code": "JoinList-hbcn",
+            "school": [
+                "schoolClassid1"
+            ],
+            "teacher": [
+                "stulistGUID"
+            ]
+        },
+        {
+            "id": "tmdid",
+            "code": "JoinList-tmdid",
+            "school": [
+                "schoolClassid1"
+            ],
+            "teacher": [
+                "schoolClassid1"
+            ]
+        }
+     */
+
+    /// <summary>
+    /// 学生已经加入的名单列表
+    /// 分学校创建的学生名单和教师创建的私人名单
+    /// </summary>
+    public class JoinList : CosmosEntity
+    {
+        public JoinList()
+        {
+            pk = "JoinList";
+        }
+        public List<string> school { get; set; } = new List<string>();
+        public List<string> teacher { get; set; } = new List<string>();
+    }
+}

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/Common/Survey.cs

@@ -20,9 +20,9 @@ namespace TEAMModelOS.SDK.Models
             tmdids = new List<string>();
             tmdids = new List<string>();
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        ///发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         /// <summary>
         /// <summary>
         /// 学校编码或教室tmdid
         /// 学校编码或教室tmdid
         /// </summary>
         /// </summary>

+ 2 - 2
TEAMModelOS.SDK/Models/Cosmos/Common/Vote.cs

@@ -21,9 +21,9 @@ namespace TEAMModelOS.SDK.Models
 
 
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        /// 发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         /// <summary>
         /// <summary>
         /// 学校编码或教师tmdid
         /// 学校编码或教师tmdid
         /// </summary>
         /// </summary>

+ 3 - 3
TEAMModelOS.SDK/Models/Cosmos/School/ExamInfo.cs

@@ -23,9 +23,9 @@ namespace TEAMModelOS.SDK.Models
             classes = new List<string>();
             classes = new List<string>();
         }
         }
         /// <summary>
         /// <summary>
-        /// blob容器名
+        ///发布层级 类型 school  teacher
         /// </summary>
         /// </summary>
-        public string blobcntr { get; set; }
+        public string owner { get; set; }
         public string name { get; set; }
         public string name { get; set; }
         public string school { get; set; }
         public string school { get; set; }
         public string creatorId { get; set; }
         public string creatorId { get; set; }
@@ -108,7 +108,7 @@ namespace TEAMModelOS.SDK.Models
         public List<List<string>> answers { get; set; } = new List<List<string>>();
         public List<List<string>> answers { get; set; } = new List<List<string>>();
         public List<List<string>> knowledge { get; set; } = new List<List<string>>();
         public List<List<string>> knowledge { get; set; } = new List<List<string>>();
         //题目类型
         //题目类型
-        public List<List<string>> type { get; set; } = new List<List<string>>();
+        public List<string> type { get; set; } = new List<string>();
         public List<int> field { get; set; } = new List<int>();
         public List<int> field { get; set; } = new List<int>();
     }
     }
     /*public class Condition
     /*public class Condition

+ 6 - 2
TEAMModelOS/ClientApp/src/api/courseMgmt.js

@@ -31,7 +31,7 @@ export default {
     upsertPlan: function (data) {
     upsertPlan: function (data) {
         return post('/api/Course/upsertPlan', data)
         return post('/api/Course/upsertPlan', data)
     },
     },
-    //查询课程安排数据
+    //查询课程安排数据 (废弃,已经没有courseManagement结构)
     findPlan: function (data) {
     findPlan: function (data) {
         return post('/school/course/find-management', data)
         return post('/school/course/find-management', data)
     },
     },
@@ -89,5 +89,9 @@ export default {
     //根据stulist ids换取详细信息
     //根据stulist ids换取详细信息
     findListSummary: function (data) {
     findListSummary: function (data) {
         return post('/school/course/get-summary-list', data)
         return post('/school/course/get-summary-list', data)
-    }
+    },
+    //查询课程安排数据 (废弃,已经没有courseManagement结构)
+    findCusByClass: function (data) {
+        return post('/school/course/find-course-by-classId', data)
+    },
 }
 }

+ 0 - 293
TEAMModelOS/ClientApp/src/common/BaseExamList.vue

@@ -1,293 +0,0 @@
-<template>
-    <div class="ex-list-container">
-        <div class="btn-more" @click="goEvaluationList">
-            <span style="font-size:14px"><Icon type="md-list-box" color="#a2a2a2" size="20" style="margin-right:5px;margin-bottom:5px;" />{{$t('totalAnalysis.newest')}}</span>
-            <span style="margin-top:2px">{{$t('totalAnalysis.more')}} <Icon type="ios-arrow-dropright" /></span>
-        </div>
-        <!-- 测验列表展示区域 -->
-        <div class="ex-list-wrap scrollstyle">
-            <vuescroll>
-                <div class="no-data-text" v-if="!examList.length">暂无数据</div>
-                <div v-else v-for="(item,index) in examList" :class="['list-item',examIndex == index ? 'list-item-active' : '']" :key="index" @click="handleExamClick(index,item)">
-                    <p class="list-item-type"><span class="type1" :style="{color:colorTransfer[item.conditions.range],borderColor:colorTransfer[item.conditions.range]}">{{item.conditions.range}}</span></p>
-                    <span class="list-item-name">{{item.name}}</span>
-                    <span class="list-item-info">{{item.stuCount}}人 | {{item.time || '2019-02-11'}}</span>
-                </div>
-            </vuescroll>
-        </div>
-    </div>
-</template>
-
-<script>
-    export default {
-        name: 'headers',
-        props: ['getExamIndex'],
-        data() {
-            return {
-                searchValue: '',
-                selectPeriod: 0,
-                selectGrade: 0,
-                selectTerm: 0,
-                selectExamType: 0,
-                periodList: ['所有学段', '高中', '初中'],
-                gradeList: [],
-                termList: [],
-                examTypeList: ['所有测验类型', '区域测验', '校内测验', '全国测验'],
-                examList: [],
-                examIndex: 0,
-                typesTransfer: {
-                    'A': '区域测验',
-                    'B': '校内测验',
-                    'C': '全国测验'
-                },
-                colorTransfer: {
-                    '校级测验': '#fbd103',
-                    '诊断测验': '#baecff',
-                    '全国测验': '#00ff8a'
-                }
-
-            }
-        },
-        created() {
-			if(this.getVuexExamList && this.getVuexExamList.length){
-				this.examList = this.getVuexExamList
-			}else{
-				this.getExamList()
-			}
-        },
-        methods: {
-            // 获取评测列表
-            getExamList() {
-                this.$api.totalAnalysis.getExamList({ code: this.$store.state.totalAnalysis.campusCode }).then(res => { // api请求
-                    if(res.result.data.length){
-						this.examList = res.result.data
-						this.handleExamClick(0,res.result.data[0])
-					}else{
-						this.examList = []
-						this.$Message.warning('暂无评测数据')
-					}
-					
-                }).catch(err => {
-                    console.log(err)
-                })
-            },
-            handleExamClick(index, item) {
-                let that = this
-                this.examIndex = index
-                this.$emit('chooseExam', item)
-                that.$router.push({ path: '/total', query: { index: index } })
-            },
-
-            // 查看更多评测列表
-            goEvaluationList() {
-				this.$router.push({
-					name: 'totalIndex',
-					params: {
-						tabName: 'tab2'
-					}
-				})
-            }
-        },
-        mounted() {
-            // this.$emit('chooseExam', this.examList[0]);
-        },
-		computed: {
-			getVuexExamList() {
-			    return this.$store.state.totalAnalysis.examList
-			},
-		},
-		watch:{
-			getVuexExamList(val) {
-				console.log(val)
-			    if(val.length){
-					this.examList = val
-				}
-			}
-		}
-    }
-</script>
-
-<style scoped>
-    .ex-list-container {
-        width: 300px;
-        height: 100%;
-        background: #191919;
-        display: flex;
-        flex-direction: column;
-    }
-
-    .ex-select-wrap {
-        padding: 10px 30px;
-        border-bottom: 1px solid rgba(128,128,128,.3);
-    }
-
-    .ex-list-container .no-data-text {
-        width: 100%;
-        font-size: 20px;
-        font-weight: bold;
-        color: #777777;
-        text-align: center;
-        padding-top: 30px;
-    }
-
-    .ex-list-wrap {
-        width: 100%;
-        overflow-y: auto;
-    }
-
-        .ex-list-wrap .list-item {
-            width: 100%;
-            padding: 20px 30px;
-            display: flex;
-            flex-direction: column;
-            justify-content: center;
-            border-bottom: 1px solid rgba(50,50,50,.35);
-            cursor: pointer;
-        }
-
-            .ex-list-wrap .list-item:hover {
-                background: #272727;
-            }
-
-        .ex-list-wrap .list-item-active {
-            background: #282828;
-        }
-
-        .ex-list-wrap .list-item .list-item-type .type1 {
-            padding: 2px 10px;
-            color: #fbd103;
-            border-radius: 10px;
-            border: 1px solid #fbd103;
-            font-size: 12px;
-        }
-
-        .ex-list-wrap .list-item .list-item-name {
-            font-size: 16px;
-            font-weight: 300;
-            color: #d0d0d0;
-            margin: 10px 0;
-        }
-
-        .ex-list-wrap .list-item .list-item-info {
-            font-size: 14px;
-            color: #a2a2a2;
-        }
-
-    .ex-list-container .btn-more {
-        width: 100%;
-        padding: 14px 10px 10px 10px;
-        color: #a2a2a2;
-        display: flex;
-        flex-direction: row;
-        justify-content: space-between;
-        cursor: pointer;
-        box-shadow: 0px 1px 3px 0px #5a5a5a;
-    }
-
-        .ex-list-container .btn-more .ivu-icon {
-            font-size: 16px;
-            margin-left: 2px;
-            margin-bottom: 4px;
-            vertical-align: middle;
-        }
-
-    /*滚动条样式重写*/
-    .scrollstyle::-webkit-scrollbar {
-        width: 5px;
-        display: none;
-    }
-
-    .scrollstyle:hover .scrollstyle::-webkit-scrollbar {
-        display: unset;
-    }
-
-    .scrollstyle::-webkit-scrollbar-track {
-        margin: 6px;
-        background: transparent;
-        display: none;
-    }
-
-    .scrollstyle::-webkit-scrollbar-thumb {
-        border-radius: 10px;
-        background: #94998a;
-    }
-
-        .scrollstyle::-webkit-scrollbar-thumb:hover {
-            /*background: #555;*/
-        }
-
-    .scrollstyle::-webkit-scrollbar-button {
-        display: none;
-    }
-
-    .fl-center {
-        display: flex;
-        align-items: center;
-        justify-content: center;
-    }
-
-    .fl-around {
-        display: flex;
-        align-items: center;
-        justify-content: space-around;
-    }
-</style>
-
-<style>
-
-    .ex-list-container .ivu-input {
-        border: none;
-        background: transparent;
-        border-bottom: 1px solid #595959;
-        height: 60px;
-        padding-left: 30px;
-        font-size: 16px;
-        font-weight: bold;
-        color: #a2a2a2;
-        box-shadow: none;
-        border-radius: 0;
-    }
-
-        .ex-list-container .ivu-input::-webkit-input-placeholder {
-            color: #616161;
-        }
-
-    .ex-select-wrap .ivu-select {
-        margin: 5px 0;
-        height: 40px;
-        color: #c5c8ce;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-selection {
-        height: 40px;
-        background: transparent;
-        border: none;
-        box-shadow: none;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-dropdown {
-        background: #3e3e3e;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-item {
-        color: #fff;
-    }
-
-        .ex-select-wrap .ivu-select-single .ivu-select-item:hover {
-            background: #5f5f5f;
-        }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-selected-value {
-        font-size: 16px;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-item-focus {
-        background: transparent;
-    }
-
-    .ex-select-wrap .ivu-select-single .ivu-select-placeholder {
-        height: 40px;
-        line-height: 40px;
-        font-size: 16px;
-    }
-</style>

+ 92 - 0
TEAMModelOS/ClientApp/src/common/BasePdSelect.vue

@@ -0,0 +1,92 @@
+<template>
+    <div class="pd-select-wrap">
+        <Dropdown class="sort-dropdown" trigger="click" placement="bottom-start" @on-click="function(e){ filterPeriod = e }" @on-visible-change="dropdownStates" v-if="$store.state.user.schoolProfile.school_base">
+            <span style="cursor: pointer;">
+                {{$t('schoolBaseInfo.pdLabel')}}
+                <b class="title">{{ filterPeriodName }}</b>
+                <Icon type="ios-arrow-down" style="margin-left:8px;"></Icon>
+            </span>
+            <DropdownMenu slot="list" v-for="(item,index) in periods" :value="item.id" :key="index">
+                <DropdownItem :name="item.id">{{ item.name }}</DropdownItem>
+            </DropdownMenu>
+        </Dropdown>
+    </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+export default {
+    name: 'BasePdSelect',
+    props: {
+    },
+    data() {
+        return {
+            filterPeriod: '',
+        }
+    },
+    created() {
+        this.$store.dispatch('user/getSchoolProfile').then(
+            (res) => {
+                if (res) {
+                    if (this.periods) this.filterPeriod = this.periods[0].id
+                }
+            },
+            (err) => {
+                this.$Message.error('API error!')
+            }
+        )
+    },
+    methods: {
+        dropdownStates(flag) {
+            // if (!flag) this.filterByPeriod()
+        }
+    },
+    computed: {
+        ...mapGetters({
+            periods: 'user/getPeriods', // 學制s
+        }),
+        filterPeriodName: function () {
+            let data = this.periods
+            let pId = this.filterPeriod
+            let name = ''
+            if (pId !== '') {
+                let temp = data.filter(item => {
+                    return pId == item.id
+                })
+                if (temp.length > 0) name = temp[0].name
+            }
+            return name
+        },
+    },
+    watch: {
+        filterPeriod() {
+            this.$emit('pd-change', this.filterPeriod)
+        }
+    }
+}
+</script>
+<style lang="less">
+.pd-select-wrap{
+    display: inline-block;
+}
+.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>

+ 12 - 5
TEAMModelOS/ClientApp/src/components/evaluation/ExerciseList.vue

@@ -30,12 +30,15 @@
 						<div class="item-option-text" v-html="option.value"></div>
 						<div class="item-option-text" v-html="option.value"></div>
 					</div>
 					</div>
 				</div>
 				</div>
-				<transition name="slide">
+				<div class="exercise-item-children" v-if="item.children.length">
+					<BaseChild :children="item.children"></BaseChild>
+				</div>
+				<transition name="slide" v-if="item.type !== 'compose'">
 					<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
 					<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
-						<div v-if="item.type !== 'compose'">
+						<div>
 							<!-- 答案展示部分 -->
 							<!-- 答案展示部分 -->
 							<div class="item-explain">
 							<div class="item-explain">
-								<span class="explain-title">【答ㅤ案】</span>
+								<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
 								<div class="item-explain-details">
 								<div class="item-explain-details">
 									<!-- 问答题答案 -->
 									<!-- 问答题答案 -->
 									<div v-if="item.type === 'subjective' || item.type === 'complete' || item.type === 'connector' || item.type === 'correct'">
 									<div v-if="item.type === 'subjective' || item.type === 'complete' || item.type === 'connector' || item.type === 'correct'">
@@ -72,9 +75,9 @@
 							</div>
 							</div>
 						</div>
 						</div>
 						<!-- 如果是综合题 则加载子题渲染组件 -->
 						<!-- 如果是综合题 则加载子题渲染组件 -->
-						<div v-else>
+						<!-- <div v-else>
 							<BaseChild :children="item.children"></BaseChild>
 							<BaseChild :children="item.children"></BaseChild>
-						</div>
+						</div> -->
 					</div>
 					</div>
 				</transition>
 				</transition>
 				
 				
@@ -214,6 +217,10 @@
 					);
 					);
 					if (exerciseItemDom.length) {
 					if (exerciseItemDom.length) {
 						this.$emit("pageScroll", exerciseItemDom[0].offsetTop);
 						this.$emit("pageScroll", exerciseItemDom[0].offsetTop);
+						exerciseItemDom[0].style.border = '3px solid #2db7f5'
+						setTimeout(() => {
+							exerciseItemDom[0].style.border = 'none'
+						},2000)
 					}
 					}
 				}
 				}
 
 

+ 3 - 5
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQnForm.vue

@@ -171,10 +171,9 @@
 							params.endTime = this.qnForm.endTime
 							params.endTime = this.qnForm.endTime
 							params.description = this.qnForm.description
 							params.description = this.qnForm.description
 							// 新增参数
 							// 新增参数
+							params.owner = this.$route.name === 'personalSurvey' ? 'teacher' : 'school'
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
-							params.blobcntr = params.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
-							
 							
 							
 							// 如果是编辑状态 则直接复制ID 如果是新增 则直接赋值新ID
 							// 如果是编辑状态 则直接复制ID 如果是新增 则直接赋值新ID
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
@@ -205,9 +204,8 @@
 					}).then(res => {
 					}).then(res => {
 						if (!res.error && res.courses) {
 						if (!res.error && res.courses) {
 							this.$store.dispatch('user/getSchoolProfile').then(schoolProfile => {
 							this.$store.dispatch('user/getSchoolProfile').then(schoolProfile => {
-							    let schoolClasses =  schoolProfile.school_classes
-								console.log(schoolClasses)
-								r([...res.courses,...schoolClasses])
+							    // let schoolClasses =  schoolProfile.school_classes
+								r(res.courses)
 							}).catch(err => {
 							}).catch(err => {
 								r([])
 								r([])
 							})
 							})

+ 8 - 4
TEAMModelOS/ClientApp/src/components/questionnaire/BaseQuestionnaire.vue

@@ -290,7 +290,6 @@
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						resolve(itemJson)
 						resolve(itemJson)
 					}catch(e){
 					}catch(e){
-						this.$Message.error(this.$t('survey.getFileFailTip'))
 						reject(e)
 						reject(e)
 					}
 					}
 				})
 				})
@@ -382,9 +381,14 @@
 					/** 编辑回显 */
 					/** 编辑回显 */
 					if (newValue && newValue.id) {
 					if (newValue && newValue.id) {
 						if(newValue.progress !== 'pending'){
 						if(newValue.progress !== 'pending'){
-							let records = await this.getQnRecord(newValue)
-							let items = await this.getBlobItems(newValue)
-							this.makeItemResult(records,items)
+							try{
+								let records = await this.getQnRecord(newValue)
+								let items = await this.getBlobItems(newValue)
+								this.makeItemResult(records,items)
+							}catch(e){
+								this.$Message.error(this.$t('survey.getFileFailTip'))
+							}
+							
 						}else{
 						}else{
 							this.items = await this.getBlobItems(newValue)
 							this.items = await this.getBlobItems(newValue)
 						}
 						}

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

@@ -157,6 +157,7 @@
                         containLabel: true,
                         containLabel: true,
                         height: 300,
                         height: 300,
                         width: '75%',
                         width: '75%',
+						right:'18%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型
@@ -195,7 +196,6 @@
                     xAxis: {
                     xAxis: {
                         show: true, // 是否显示
                         show: true, // 是否显示
                         position: 'bottom', // x轴的位置
                         position: 'bottom', // x轴的位置
-                        offset: 0, // x轴相对于默认位置的偏移
                         type: 'category', // 轴类型, 默认为 'category'
                         type: 'category', // 轴类型, 默认为 'category'
                         name: '月份', // 轴名称
                         name: '月份', // 轴名称
                         nameLocation: 'end', // 轴名称相对位置
                         nameLocation: 'end', // 轴名称相对位置

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

@@ -57,6 +57,7 @@
                         containLabel: true,
                         containLabel: true,
                         height: 300,
                         height: 300,
                         width: '75%',
                         width: '75%',
+						right:'18%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型

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

@@ -50,9 +50,9 @@
                     grid: {
                     grid: {
                         show: false, // 是否显示直角坐标系网格
                         show: false, // 是否显示直角坐标系网格
                         top: 80, // 相对位置 top\bottom\left\right
                         top: 80, // 相对位置 top\bottom\left\right
-						left:20,
+						left:'center',
 						width:'80%',
 						width:'80%',
-                        height: 480,
+                        height: 420,
                         containLabel: true // gird 区域是否包含坐标轴的刻度标签
                         containLabel: true // gird 区域是否包含坐标轴的刻度标签
                     },
                     },
                     dataZoom: [{
                     dataZoom: [{
@@ -61,7 +61,7 @@
                         'xAxisIndex': [
                         'xAxisIndex': [
                             0
                             0
                         ],
                         ],
-                        bottom: 10,
+                        bottom:60,
                         'start': 0,
                         'start': 0,
                         'end': 100,
                         'end': 100,
                         handleIcon: 'M512 497.821538m-418.264615 0a418.264615 418.264615 0 1 0 836.52923 0 418.264615 418.264615 0 1 0-836.52923 0Z',
                         handleIcon: 'M512 497.821538m-418.264615 0a418.264615 418.264615 0 1 0 836.52923 0 418.264615 418.264615 0 1 0-836.52923 0Z',

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

@@ -31,7 +31,7 @@
 						name: that.$t('totalAnalysis.le_title1'),
 						name: that.$t('totalAnalysis.le_title1'),
 						type: 'pie',
 						type: 'pie',
 						radius: [40, 150],
 						radius: [40, 150],
-						center: ['45%', 190],
+						center: ['45%', '60%'],
 						max: 100, // for funnel
 						max: 100, // for funnel
 						sort: 'ascending', // for funnel
 						sort: 'ascending', // for funnel
 						data: data
 						data: data

+ 3 - 1
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseLevelRadar.vue

@@ -116,10 +116,12 @@
 			doRender(data) {
 			doRender(data) {
 				let list = data
 				let list = data
 				let indicator = []
 				let indicator = []
+				// 获取最大值 +5 设置到雷达边界最大值
+				let maxNum = Math.max(...data.per.map(i => Number(i) * 100)) + 5
 				list.pointList.forEach(item => {
 				list.pointList.forEach(item => {
 					indicator.push({
 					indicator.push({
 						name: item,
 						name: item,
-						max: 100
+						max: maxNum
 					})
 					})
 				})
 				})
 				this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))
 				this.drawLine(indicator, list.per.map(item => (Number(item) * 100).toFixed(2)))

+ 34 - 25
TEAMModelOS/ClientApp/src/components/student-analysis/total/BaseMyTable.vue

@@ -2,23 +2,22 @@
     <div class="myTable">
     <div class="myTable">
         <!-- 科目选择以及表格备注 -->
         <!-- 科目选择以及表格备注 -->
         <div class="table-subject-select">
         <div class="table-subject-select">
-            <Select v-model="subjectSelectVal" style="width:150px" v-if="showSelect" @on-change="onSelectChange">
+            <!-- <Select v-model="subjectSelectVal" style="width:150px" v-if="showSelect" @on-change="onSelectChange">
                 <Option v-for="(item,index) in subjectList" :value="index" :key="index">{{ item }}</Option>
                 <Option v-for="(item,index) in subjectList" :value="index" :key="index">{{ item }}</Option>
-            </Select>
+            </Select> -->
+			<div class="myTable-title">{{ tableName }}</div>
             <div>
             <div>
                 <span @click="exportData(3)" class="table-export-btn"><Icon type="ios-share-alt" /> {{$t('totalAnalysis.exportTable').slice(0,2)}}</span>
                 <span @click="exportData(3)" class="table-export-btn"><Icon type="ios-share-alt" /> {{$t('totalAnalysis.exportTable').slice(0,2)}}</span>
-
                 <span class="table-tips" v-if="tips">{{tips}}</span>
                 <span class="table-tips" v-if="tips">{{tips}}</span>
                 <span class="table-tips" v-if="!tips"></span>
                 <span class="table-tips" v-if="!tips"></span>
             </div>
             </div>
             
             
         </div>
         </div>
-
         <!-- 表格组件 -->
         <!-- 表格组件 -->
         <Table :border="isShowBorder" ref="table" :data="tableData" :columns="tableColumns" @on-sort-change="onSortChange" @on-filter-change="onFilterChange"></Table>
         <Table :border="isShowBorder" ref="table" :data="tableData" :columns="tableColumns" @on-sort-change="onSortChange" @on-filter-change="onFilterChange"></Table>
 
 
         <!-- 表格分页组件 -->
         <!-- 表格分页组件 -->
-        <div style="margin: 10px;overflow: hidden">
+        <div style="margin: 10px;overflow: hidden" v-if="!noPage">
             <div style="float: right;margin-top: 20px;">
             <div style="float: right;margin-top: 20px;">
                 <Page show-total
                 <Page show-total
                       size="small"
                       size="small"
@@ -55,9 +54,17 @@
                 type: Boolean,
                 type: Boolean,
                 default: false
                 default: false
             },
             },
+			noPage: {
+			    type: Boolean,
+			    default: false
+			},
             tips: {
             tips: {
                 type: String,
                 type: String,
                 default: null
                 default: null
+            },
+			tableTitle: {
+                type: String,
+                default: null
             },
             },
             pageSize: {
             pageSize: {
                 type: Number,
                 type: Number,
@@ -125,6 +132,7 @@
 			
 			
 			// 排序操作
 			// 排序操作
             onSortChange(data) {
             onSortChange(data) {
+				console.log(data)
                 let order = data.order // 当前排序方式 升序、降序、正常
                 let order = data.order // 当前排序方式 升序、降序、正常
                 let key = data.key // 当前排序依据
                 let key = data.key // 当前排序依据
                 switch (order) {
                 switch (order) {
@@ -195,20 +203,6 @@
                 let that = this
                 let that = this
                 let row = params.row
                 let row = params.row
                 return h('span', {
                 return h('span', {
-                    on: {
-                        click: function () {
-                            that.$store.commit('updateExportTable', [{
-                                tableRef: 'earlyWarningTable',
-                                tableName: that.$t('totalAnalysis.myTable.rank')
-                            }])
-                            that.$router.push({ path: '/total/achievement/earlyWarning', query: { name: params.row.classId } })
-                        }
-                    },
-                    style: {
-                        cursor: 'pointer',
-                        color: '#00ffd2',
-                        fontWeight: 'bold'
-                    }
                 }, [
                 }, [
                     h('span', {
                     h('span', {
                         domProps: {
                         domProps: {
@@ -368,13 +362,17 @@
             renderHard(h, params) {
             renderHard(h, params) {
                 let that = this
                 let that = this
                 const list = params.row.hardList ? params.row.hardList.split(',') : params.row.itemNO.split(',')
                 const list = params.row.hardList ? params.row.hardList.split(',') : params.row.itemNO.split(',')
-                return h('span', list.map(function(item, index) {
+                return h('span', { style: {
+                            textAlign:'left'
+                        }},list.map(function(item, index) {
                     return h('span', {
                     return h('span', {
                         style: {
                         style: {
                             fontSize: '16px',
                             fontSize: '16px',
                             fontWeight: '600',
                             fontWeight: '600',
                             color: '#03efdb',
                             color: '#03efdb',
-                            cursor: 'pointer'
+                            cursor: 'pointer',
+							display: 'inline-block',
+							float: 'left'
                         },
                         },
                         on: {
                         on: {
                             'click': function() {
                             'click': function() {
@@ -397,7 +395,9 @@
                             fontSize: '16px',
                             fontSize: '16px',
                             fontWeight: '600',
                             fontWeight: '600',
                             color: '#03efdb',
                             color: '#03efdb',
-                            cursor: 'pointer'
+                            cursor: 'pointer',
+							display: 'inline-block',
+							float: 'left'
                             // textDecoration: "underline"
                             // textDecoration: "underline"
                         },
                         },
                         on: {
                         on: {
@@ -417,7 +417,11 @@
         },
         },
 
 
         mounted() {
         mounted() {
-            
+            if(this.noPage){
+				this.pageSizes = 999999
+				this.pageChange(1)
+				this.currentPage = 1
+			}
         },
         },
 
 
         computed: {
         computed: {
@@ -462,6 +466,7 @@
         /*height: 400px;*/
         /*height: 400px;*/
         /*padding: 20px 0;*/
         /*padding: 20px 0;*/
         padding-right: 20px;
         padding-right: 20px;
+		margin-top: 20px;
         margin: 0 auto;
         margin: 0 auto;
         display: block;
         display: block;
         user-select: none !important;
         user-select: none !important;
@@ -604,7 +609,7 @@
             font-weight: bold;
             font-weight: bold;
             position: absolute;
             position: absolute;
             right: 65px;
             right: 65px;
-            top: 15px;
+            top: 10px;
         }
         }
 
 
         .table-subject-select .ivu-select {
         .table-subject-select .ivu-select {
@@ -636,7 +641,7 @@
             width:50px;
             width:50px;
             position: absolute;
             position: absolute;
             right: 5px;
             right: 5px;
-            top: 15px;
+            top: 10px;
             cursor:pointer;
             cursor:pointer;
         }
         }
 
 
@@ -672,4 +677,8 @@
         line-height: 27px;
         line-height: 27px;
         font-size: 12px;
         font-size: 12px;
     }
     }
+	
+	.myTable .myTable-title{
+		font-size: 16px;
+	}
 </style>
 </style>

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

@@ -31,7 +31,7 @@
                         name: that.$t('totalAnalysis.ka_title1'),
                         name: that.$t('totalAnalysis.ka_title1'),
                         type: 'pie',
                         type: 'pie',
                         radius: [40, 150],
                         radius: [40, 150],
-                        center: ['45%', 190],
+                        center: ['45%', '60%'],
                         max: 100, // for funnel
                         max: 100, // for funnel
                         sort: 'ascending', // for funnel
                         sort: 'ascending', // for funnel
                         data: data
                         data: data

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

@@ -44,7 +44,7 @@
                                 padding: [13, 15]
                                 padding: [13, 15]
                             }
                             }
                         },
                         },
-                        center: ['50%', '50%'],
+                        center: ['50%', '62%'],
 						radius:'60%',
 						radius:'60%',
                         tooltip: {
                         tooltip: {
                             trigger: 'item'
                             trigger: 'item'
@@ -121,10 +121,12 @@
 
 
             doRender(data) {
             doRender(data) {
                 let indicator = []
                 let indicator = []
+				// 获取最大值 +5 设置到雷达边界最大值
+				let maxNum = Math.max(...data.per.map(i => Number(i) * 100)) + 5
                 data.pointList.forEach(item => {
                 data.pointList.forEach(item => {
                     indicator.push({
                     indicator.push({
                         name: item,
                         name: item,
-                        max: 100
+                        max: maxNum
                     })
                     })
                 })
                 })
                 this.drawLine(indicator, data.stupercent.grade.map(item => (Number(item)).toFixed(2)))
                 this.drawLine(indicator, data.stupercent.grade.map(item => (Number(item)).toFixed(2)))

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

@@ -42,7 +42,6 @@
 				// 基于准备好的dom,初始化echarts实例
 				// 基于准备好的dom,初始化echarts实例
 				let myScatter = this.$echarts.init(document.getElementById('myScatter'), 'chalk')
 				let myScatter = this.$echarts.init(document.getElementById('myScatter'), 'chalk')
 				let _this = this
 				let _this = this
-				console.log('落点图数据', data)
 				// 指定图表的配置项和数据
 				// 指定图表的配置项和数据
 				var option = {
 				var option = {
 					tooltip: {
 					tooltip: {
@@ -332,7 +331,6 @@
 			scatterData: {
 			scatterData: {
 				deep: true,
 				deep: true,
 				handler(val) {
 				handler(val) {
-					console.log('变化了',val)
 					if (val.length) {
 					if (val.length) {
 						this.drawLine(this.renderData(val)) // 获取最新落点图数据 进行渲染
 						this.drawLine(this.renderData(val)) // 获取最新落点图数据 进行渲染
 					} else {
 					} else {

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

@@ -47,7 +47,7 @@
                 targetImg: "",
                 targetImg: "",
                 columns: [
                 columns: [
                     {
                     {
-                        title: '投票时间',
+                        title: this.$t('studentWeb.vote.voteTime'),
                         key: 'time',
                         key: 'time',
                         sortable: true
                         sortable: true
                     },
                     },

+ 2 - 4
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/PaperView.vue

@@ -139,13 +139,13 @@
                                             k++
                                             k++
                                         }
                                         }
                                     }
                                     }
-                                    if (k == 0) {
+                                    if (k == 0 && this.paperData[i].progress == 'finish') {
                                         isTest++
                                         isTest++
                                     }
                                     }
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        if (isTest == this.paperData.length) {
+                        if (isTest == this.paperData.length ) {
                             this.isTestOver = true
                             this.isTestOver = true
                         }
                         }
                         this.opentestWithSubject(this.paperData[0])
                         this.opentestWithSubject(this.paperData[0])
@@ -172,7 +172,6 @@
                 }
                 }
             },
             },
             async getPaper(data) {
             async getPaper(data) {
-                console.log('paper', data)
                 this.isExamDown = false
                 this.isExamDown = false
                 this.isLoad = true
                 this.isLoad = true
                 this.selectData = {}
                 this.selectData = {}
@@ -184,7 +183,6 @@
                         code: key[key.length - 1],
                         code: key[key.length - 1],
                         blob: data.blob
                         blob: data.blob
                     }
                     }
-                    console.log('评测信息',this.$store.getters.getItemTitle)
                     let exam = {}
                     let exam = {}
                     for (let item of this.examData) {
                     for (let item of this.examData) {
                         if (data.paperId == item.id) {
                         if (data.paperId == item.id) {

+ 10 - 13
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/QuesNaire.vue

@@ -144,7 +144,6 @@
 					}
 					}
 				}
 				}
 				this.$forceUpdate()
 				this.$forceUpdate()
-				console.log(this.submitArr)
 			},
 			},
 
 
 			submitMessage() {
 			submitMessage() {
@@ -158,14 +157,14 @@
 				this.$api.studentWeb.answerSurvey(params).then(async res => {
 				this.$api.studentWeb.answerSurvey(params).then(async res => {
 					switch (res.msgid){
 					switch (res.msgid){
 						case 1:
 						case 1:
-							this.$Message.success('提交成功!')
+							this.$Message.success(this.$t('studentWeb.queNaire.submitSuccess'))
 							this.alreadyAnswered = true
 							this.alreadyAnswered = true
 							break;
 							break;
 						case 2:
 						case 2:
-							this.$Message.error('不在作答时间范围内!')
+                            this.$Message.error(this.$t('studentWeb.queNaire.overTime'))
 							break;
 							break;
 						case 3:
 						case 3:
-							this.$Message.error('作答数据有误!')
+                            this.$Message.error(this.$t('studentWeb.queNaire.answerErr'))
 							break;		
 							break;		
 						default:
 						default:
 							break;
 							break;
@@ -251,14 +250,14 @@
 			// 获取blob里的试题数据
 			// 获取blob里的试题数据
 			getBlobItems(qnItem) {
 			getBlobItems(qnItem) {
 				return new Promise(async (resolve, reject) => {
 				return new Promise(async (resolve, reject) => {
-					// let blobHost = qnItem.scope === 'private' ?  JSON.parse(decodeURIComponent(localStorage.user_profile, "utf-8")).blob_uri : JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
-					let blobUrl = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
-					let blobHost = blobUrl.slice(0,blobUrl.lastIndexOf('/')) + '/' +  qnItem.blobcntr
+					let schoolBlobHost = JSON.parse(decodeURIComponent(localStorage.student_profile, "utf-8")).blob_uri
+					let privateBlobHost = schoolBlobHost.slice(0,schoolBlobHost.lastIndexOf('/')) + '/' +  qnItem.creatorId
+					let cntr = qnItem.scope === 'school' ? this.$store.state.userInfo.azp : qnItem.creatorId
+					let blobHost = qnItem.scope === 'school' ?  schoolBlobHost : privateBlobHost
 					// 根据试卷的Blob地址 去读取JSON文件
 					// 根据试卷的Blob地址 去读取JSON文件
-					let sasString = qnItem.scope === 'private' ? await this.$tools.getPrivateSas(qnItem
-						.blobcntr) : await this.$tools.getSchoolSas(qnItem.blobcntr)
+					let sasString = qnItem.scope === 'private' ? await this.$tools.getPrivateSas(cntr) : await this.$tools.getSchoolSas(cntr)
 					let promiseArr = []
 					let promiseArr = []
-					let indexJson = await this.getBlobJsonFile(qnItem.scope,qnItem.blob,qnItem.blobcntr)
+					let indexJson = await this.getBlobJsonFile(qnItem.scope,qnItem.blob,cntr)
 					if(indexJson.slides.length){
 					if(indexJson.slides.length){
 						for (let item of indexJson.slides) {
 						for (let item of indexJson.slides) {
 							promiseArr.push(new Promise(async (r, j) => {
 							promiseArr.push(new Promise(async (r, j) => {
@@ -294,7 +293,7 @@
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						let itemJson = JSON.parse(await this.$tools.getFile(blobHost + url + sasString.sas))
 						resolve(itemJson)
 						resolve(itemJson)
 					}catch(e){
 					}catch(e){
-						this.$Message.error('文件获取失败!')
+                        this.$Message.error(this.$t('studentWeb.queNaire.fileErr'))
 						reject(e)
 						reject(e)
 					}
 					}
 				})
 				})
@@ -309,14 +308,12 @@
 		},
 		},
 
 
 		mounted() {
 		mounted() {
-			console.log('watch2')
 			this.getSurveyInfo()
 			this.getSurveyInfo()
 		},
 		},
 
 
 		watch: {
 		watch: {
 			$route: {
 			$route: {
 				handler() {
 				handler() {
-					console.log('watch')
 					this.getSurveyInfo()
 					this.getSurveyInfo()
 				},
 				},
 				// 深度观察监听
 				// 深度观察监听

+ 2 - 2
TEAMModelOS/ClientApp/src/components/student-web/EventView/EventContentTypeTemplate/completePaper.vue

@@ -1,8 +1,8 @@
 <template>
 <template>
     <div class="content" v-if="num.length > 0">
     <div class="content" v-if="num.length > 0">
         <div class="content-input" v-for="(item,index) of num" :key="index">
         <div class="content-input" v-for="(item,index) of num" :key="index">
-            <span class="complete-index">{{(index+1)}}:</span>
-            <Input @on-change="getInput(index)" v-model="examInfo[index]" placeholder="请输入填空内容" style="width:45%" />
+            <span class="complete-index">{{$t("studentWeb.exam.emput")}}{{(index+1)}}:</span>
+            <Input @on-change="getInput(index)" v-model="examInfo[index]" :placeholder="$t('studentWeb.exam.inputAnswers')" style="width:45%" />
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>

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

@@ -1,10 +1,10 @@
 <template>
 <template>
     <div class="content">
     <div class="content">
         <div id="textArea"> </div>
         <div id="textArea"> </div>
-        <Modal v-model="markStatus" fullscreen title="作答" footer-hide  ref="compose">
+        <Modal v-model="markStatus" fullscreen :title="$t('studentWeb.exam.answer')" footer-hide  ref="compose">
                 <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
                 <BaseMyCanvas v-if="markStatus" :bgImg="markBg" @onCloseModal="closeModal" :isStudent="markStatus" @onSaveCanvas="saveMark"></BaseMyCanvas>
         </Modal>
         </Modal>
-        <iframe class="frame"id="answerIframe" :srcdoc="itemInfo.question"></iframe>
+        <iframe class="frame" id="answerIframe" :srcdoc="itemInfo.question"></iframe>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
@@ -83,7 +83,7 @@
                     "image", // 插入图片
                     "image", // 插入图片
                 ]
                 ]
                 this.editor.config.zIndex = 1
                 this.editor.config.zIndex = 1
-                this.editor.config.placeholder = '请输入作答结果'
+                this.editor.config.placeholder = this.$t('studentWeb.exam.inputAnswers')
                 this.editor.config.height = 300
                 this.editor.config.height = 300
                 this.editor.config.showLinkImg = false;
                 this.editor.config.showLinkImg = false;
                 this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便
                 this.editor.config.uploadImgShowBase64 = true; // 使用 base64 保存图片不建议使用这种,我只是图个方便
@@ -108,10 +108,16 @@
                 answerIframe.contentWindow.document.body.style.width = 'fit-content'
                 answerIframe.contentWindow.document.body.style.width = 'fit-content'
                 answerIframe.contentWindow.document.body.style.minWidth = '600px'
                 answerIframe.contentWindow.document.body.style.minWidth = '600px'
                 answerIframe.contentWindow.document.body.style.backgroundColor = '#f5f5f5'
                 answerIframe.contentWindow.document.body.style.backgroundColor = '#f5f5f5'
+                console.log(document.getElementById('answerIframe').contentWindow.document)
                 let iframe = document.getElementById('answerIframe').contentWindow.document.getElementsByTagName('p')
                 let iframe = document.getElementById('answerIframe').contentWindow.document.getElementsByTagName('p')
-                console.log(iframe[1].style)
-                iframe[1].style.lineHeight = '50px'
-                iframe[1].style.paddingBottom = '50px'
+                if (iframe.length > 0) {
+                    for (let i = 0; i < iframe.length -1; i++) {
+                        iframe[i].style.lineHeight = '50px'
+                        iframe[i].style.paddingBottom = '30px'
+                    }
+                    iframe[iframe.length -1].style.paddingBottom = '100px'
+                    iframe[iframe.length - 1].style.lineHeight = '50px'
+                }
                 html2canvas(answerIframe.contentWindow.document.body).then(canvas => {
                 html2canvas(answerIframe.contentWindow.document.body).then(canvas => {
                     this.markStatus = true
                     this.markStatus = true
                     this.markBg = canvas.toDataURL("image/png");
                     this.markBg = canvas.toDataURL("image/png");

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

@@ -249,7 +249,7 @@
 
 
         methods: {
         methods: {
             noData() {
             noData() {
-                this.$Message.warning('此功能暂未开放!')
+                this.$Message.warning(this.$t('studentWeb.public.notice'))
 
 
             },
             },
             getCurrentLang() {
             getCurrentLang() {

+ 0 - 5
TEAMModelOS/ClientApp/src/components/student-web/HomeView/MissionListCard.vue

@@ -44,11 +44,6 @@
                                 {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
                                 {{ dateFormat(item.startTime) }} ~ {{ dateFormat(item.endTime) }}
                             </p>
                             </p>
                         </li>
                         </li>
-                <!--<li class="list-item-unDone">
-                    <PreviewProgressPie v-if=" item.eventType == 'preview'"></PreviewProgressPie>
-                    <PreviewProgressPie :itemID="item.eventID"
-                                        v-if="item.eventType == 'exam'"></PreviewProgressPie>
-                </li>-->
                 </ul>
                 </ul>
                 </div>
                 </div>
             </Scroll>
             </Scroll>

+ 4 - 4
TEAMModelOS/ClientApp/src/components/vote/BaseVoteForm.vue

@@ -271,11 +271,11 @@
 							params.repeat = this.voteForm.repeat.indexOf('repeat') > -1
 							params.repeat = this.voteForm.repeat.indexOf('repeat') > -1
 							params.options = this.voteOptionsContent
 							params.options = this.voteOptionsContent
 							// 新增参数
 							// 新增参数
+							params.owner = this.$route.name === 'personalVote' ? 'teacher' : 'school'
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.creatorId = this.$store.state.userInfo.TEAMModelId
 							params.voteNum = this.voteForm.selectMax
 							params.voteNum = this.voteForm.selectMax
 							params.times = this.voteForm.times
 							params.times = this.voteForm.times
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
 							params.school = params.scope === 'school' ?  this.$store.state.userInfo.schoolCode : null
-							params.blobcntr = params.scope === 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId
 							
 							
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 							if (this.isEdit && this.editInfo.id && this.editInfo.code) {
 								params.id = this.editInfo.id
 								params.id = this.editInfo.id
@@ -423,9 +423,9 @@
 					}).then(res => {
 					}).then(res => {
 						if (!res.error && res.courses) {
 						if (!res.error && res.courses) {
 							this.$store.dispatch('user/getSchoolProfile').then(schoolProfile => {
 							this.$store.dispatch('user/getSchoolProfile').then(schoolProfile => {
-							    let schoolClasses =  schoolProfile.school_classes
-								console.log(schoolClasses)
-								r([...res.courses,...schoolClasses])
+							 //    let schoolClasses =  schoolProfile.school_classes
+								// console.log(schoolClasses)
+								r(res.courses)
 							}).catch(err => {
 							}).catch(err => {
 								r([])
 								r([])
 							})
 							})

+ 226 - 193
TEAMModelOS/ClientApp/src/css/site.css

@@ -1,80 +1,89 @@
-html{ /*黑色主題*/
-    --bg-color: #252525; /*背景顏色*/
+html {
+	/*黑色主題*/
+	--bg-color: #252525;
+	/*背景顏色*/
 }
 }
 
 
-html[white]{ /*白色主題*/
-    --bg-color: #fff; /*背景顏色*/    
+html[white] {
+	/*白色主題*/
+	--bg-color: #fff;
+	/*背景顏色*/
 }
 }
 
 
-.backdrop{
-    background-color: var(--bg-color);
-    width: 100%;
-    height: 100%;
+.backdrop {
+	background-color: var(--bg-color);
+	width: 100%;
+	height: 100%;
 }
 }
 
 
 /*基本亮背景*/
 /*基本亮背景*/
-.backdrop-light{
-    width: 100%;
-    height: 100%;
-    background-image: url('../assets/image/bak_light.jpg');
-    background-repeat: no-repeat;
-    background-attachment: fixed;
-    background-position: center;
-    background-size: cover;
+.backdrop-light {
+	width: 100%;
+	height: 100%;
+	background-image: url('../assets/image/bak_light.jpg');
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	background-position: center;
+	background-size: cover;
 }
 }
 
 
 /*基本暗背景*/
 /*基本暗背景*/
-.backdrop-dark{
-    width: 100%;
-    height: 100%;
-    background-image: url('../assets/image/bak_dark.jpg'); 
-    background-repeat: no-repeat;
-    background-attachment: fixed;
-    background-position: center;
-    background-size: cover;
+.backdrop-dark {
+	width: 100%;
+	height: 100%;
+	background-image: url('../assets/image/bak_dark.jpg');
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	background-position: center;
+	background-size: cover;
 }
 }
 
 
 /* 邊角框設計 
 /* 邊角框設計 
     使用時,最外層一定要有position: relative;
     使用時,最外層一定要有position: relative;
 */
 */
 .image-border {
 .image-border {
-    position: absolute;
-    width: 30px;
-    height: 30px;
-}        
+	position: absolute;
+	width: 30px;
+	height: 30px;
+}
+
 .image-border-left-top {
 .image-border-left-top {
-    top: -2px;
-    left: -2px;
-    border-left: 2px solid #B9C1AD;
-    border-top: 2px solid #B9C1AD;
+	top: -2px;
+	left: -2px;
+	border-left: 2px solid #B9C1AD;
+	border-top: 2px solid #B9C1AD;
 }
 }
+
 .image-border-right-top {
 .image-border-right-top {
-    top: -2px;
-    right: -2px;
-    border-right: 2px solid #B9C1AD;
-    border-top: 2px solid #B9C1AD;
-}   
+	top: -2px;
+	right: -2px;
+	border-right: 2px solid #B9C1AD;
+	border-top: 2px solid #B9C1AD;
+}
+
 .image-border-left-bottom {
 .image-border-left-bottom {
-    bottom: -2px;
-    left: -2px;
-    border-bottom: 2px solid #B9C1AD;
-    border-left: 2px solid #B9C1AD;
-}    
+	bottom: -2px;
+	left: -2px;
+	border-bottom: 2px solid #B9C1AD;
+	border-left: 2px solid #B9C1AD;
+}
+
 .image-border-lright-bottom {
 .image-border-lright-bottom {
-    bottom: -2px;
-    right: -2px;
-    border-right: 2px solid #B9C1AD;
-    border-bottom: 2px solid #B9C1AD;
+	bottom: -2px;
+	right: -2px;
+	border-right: 2px solid #B9C1AD;
+	border-bottom: 2px solid #B9C1AD;
 }
 }
 
 
 /* 拉軸隱藏
 /* 拉軸隱藏
 用兩個div將拉軸藏起來
 用兩個div將拉軸藏起來
 */
 */
-.scroll-outer-container{
-    position: relative;
-    overflow: hidden;
+.scroll-outer-container {
+	position: relative;
+	overflow: hidden;
 }
 }
-.scroll-outer-container .scroll-inner-container{
+
+.scroll-outer-container .scroll-inner-container {
 	position: absolute;
 	position: absolute;
 	left: 0;
 	left: 0;
 	top: 0;
 	top: 0;
@@ -86,158 +95,182 @@ html[white]{ /*白色主題*/
 
 
 /* 省略字符*/
 /* 省略字符*/
 .ellipsis {
 .ellipsis {
-    overflow:hidden;
-    white-space: nowrap;
-    text-overflow: ellipsis;
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
 }
 }
 
 
 /* 拉軸固定黑色*/
 /* 拉軸固定黑色*/
 .scrollstyle::-webkit-scrollbar {
 .scrollstyle::-webkit-scrollbar {
-    width: 5px;
+	width: 5px;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-track {
 .scrollstyle::-webkit-scrollbar-track {
-  margin: 6px;
-  background: transparent;
+	margin: 6px;
+	background: transparent;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-thumb {
 .scrollstyle::-webkit-scrollbar-thumb {
-  border-radius: 10px;
-  background: #94998a;
+	border-radius: 10px;
+	background: #94998a;
 }
 }
+
 .scrollstyle::-webkit-scrollbar-thumb:hover {
 .scrollstyle::-webkit-scrollbar-thumb:hover {
-  /* background: #555; */
+	/* background: #555; */
 }
 }
+
 .scrollstyle::-webkit-scrollbar-button {
 .scrollstyle::-webkit-scrollbar-button {
-  display: none;
-}
-
-.leftInOut-enter-active, .leftInOut-leave-active {
-    transition: all 0.7s;
-}
-.leftInOut-enter, .leftInOut-leave-to /* .list-leave-active below version 2.1.8 */ {
-    opacity: 0;
-    transform: translateX(-150px);    
-}	
-
-	.richText-audio{
-		position: relative;
-		display: inline-flex;
-		flex-direction: column;
-		cursor: pointer;
-	}
-	
-	audio::-webkit-media-controls-enclosure{
-		border-radius: 0;
-	}
-	
-	audio::-internal-media-controls-overflow-button{
-		display: none;
-	}
-	
-	.w-e-toolbar .w-e-menu{
-		padding: 0 !important;
-		width: 35px !important;
-	}
-	
-	.w-e-menu .w-e-panel-container{
-		margin-left: 0 !important;
-	}
-	
-	.ivu-modal-fullscreen-no-footer .ivu-modal-confirm-footer{
-		display: none;
-	}
-	
-	.richText-audio{
-		vertical-align: middle;
-	}
-	
-	.richText-audio .audio-info{
-		padding: 8px;
-		background-color: #f1f3f4;
-		color: #000;
-		display: flex;
-		align-items: center;
-	}
-	
-	.richText-audio .audio-name{
-		font-size: 14px;
-	}
-
-	.richText-video {
-		position: relative;
-		display: inline-block;
-		cursor: pointer;
-		vertical-align: middle;
-	}
-
-	.richText-video::after {
-		content: '';
-		margin: auto;
-		width: 35px;
-		height: 35px;
-		background: url('../assets/icon/icon_play.png');
-		background-size: 100%;
-		position: absolute;
-		z-index: 999;
-		top: 0;
-		left: 0;
-		right: 0;
-		bottom: 0;
-	}
-	
-	
-	/* 修改iview Modal样式 */
-	
-	.related-modal .ivu-modal-content {
-		background: #3c3c3c;
-		overflow: hidden;
-		color: #fff;
-	}
-	
-	.related-modal .ivu-modal-body {
-		height: 400px;
-		padding: 20px;
-	}
-	
-	.related-modal .ivu-modal-body {
-		height: 700px;
-	}
-	
-	.related-modal .ivu-modal-header {
-		border-bottom: none;
-		font-size: 18px;
-		font-weight: bold;
-		padding: 25px;
-	}
-	
-	.related-modal .modal-content {
-		padding: 0 35px 30px 35px;
-	}
-	
-	.related-modal .modal-btn {
-		margin-left: 2%;
-		width: 96%;
-		height: 40px;
-		background: rgb(11, 151, 117);
-		border: none;
-		color: #fff;
-		margin-top: 30px;
-	}
-	
-	.related-modal .choose-content {
-		height: 85%;
-	}
-	
-	/*横向垂直水平居中*/
-	.flex-row-center {
-	    display: flex;
-	    flex-direction: row;
-	    justify-content: center;
-	    align-items: center;
-	}
-	/*向垂直水平居中*/
-	.flex-col-center {
-	    display: flex;
-	    flex-direction: column;
-	    justify-content: center;
-	    align-items: center;
-	}
+	display: none;
+}
+
+.leftInOut-enter-active,
+.leftInOut-leave-active {
+	transition: all 0.7s;
+}
+
+.leftInOut-enter,
+.leftInOut-leave-to
+
+/* .list-leave-active below version 2.1.8 */
+	{
+	opacity: 0;
+	transform: translateX(-150px);
+}
+
+.richText-audio {
+	position: relative;
+	display: inline-flex;
+	flex-direction: column;
+	cursor: pointer;
+}
+
+audio::-webkit-media-controls-enclosure {
+	border-radius: 0;
+}
+
+audio::-internal-media-controls-overflow-button {
+	display: none;
+}
+
+.w-e-toolbar .w-e-menu {
+	padding: 0 !important;
+	width: 35px !important;
+}
+
+.w-e-menu .w-e-panel-container {
+	margin-left: 0 !important;
+}
+
+.ivu-modal-fullscreen-no-footer .ivu-modal-confirm-footer {
+	display: none;
+}
+
+.richText-audio {
+	vertical-align: middle;
+}
+
+.richText-audio .audio-info {
+	padding: 8px;
+	background-color: #f1f3f4;
+	color: #000;
+	display: flex;
+	align-items: center;
+}
+
+.richText-audio .audio-name {
+	font-size: 14px;
+}
+
+.richText-video {
+	position: relative;
+	display: inline-block;
+	cursor: pointer;
+	vertical-align: middle;
+}
+
+.richText-video::after {
+	content: '';
+	margin: auto;
+	width: 35px;
+	height: 35px;
+	background: url('../assets/icon/icon_play.png');
+	background-size: 100%;
+	position: absolute;
+	z-index: 999;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+
+/* 修改iview Modal样式 */
+
+.related-modal .ivu-modal-content {
+	background: #3c3c3c;
+	overflow: hidden;
+	color: #fff;
+}
+
+.related-modal .ivu-modal-body {
+	height: 400px;
+	padding: 20px;
+}
+
+.related-modal .ivu-modal-body {
+	height: 700px;
+}
+
+.related-modal .ivu-modal-header {
+	border-bottom: none;
+	font-size: 18px;
+	font-weight: bold;
+	padding: 25px;
+}
+
+.related-modal .modal-content {
+	padding: 0 35px 30px 35px;
+}
+
+.related-modal .modal-btn {
+	margin-left: 2%;
+	width: 96%;
+	height: 40px;
+	background: rgb(11, 151, 117);
+	border: none;
+	color: #fff;
+	margin-top: 30px;
+}
+
+.related-modal .choose-content {
+	height: 85%;
+}
+
+/*横向垂直水平居中*/
+.flex-row-center {
+	display: flex;
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+
+/*向垂直水平居中*/
+.flex-col-center {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+
+.base-table-row {
+  padding: 0 100px 0 55px;
+  margin-top: 50px;
+}
+
+.component-title {
+	font-size: 16px;
+	font-weight: 300;
+	color: #fff;
+	margin: 30px 0 0 55px;
+	display: block;
+}

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/en-US/cusMgt.js

@@ -204,4 +204,23 @@ export default {
     nameTips:'请输入节点名称',
     nameTips:'请输入节点名称',
     typeTips:'请设置节点类型',
     typeTips:'请设置节点类型',
     startTips:'请设置时间',
     startTips:'请设置时间',
+
+    //CoursePlan.vue
+    cusTable:'课程表',
+    importLabel:'导入课表',
+    cusMode:'课程模式',
+
+    //ClassTable.vue
+    noAddTea:'当前课程未添加授课老师',
+    sltCusTips:'请先选择课程',
+    setCusWarning:'请设置课程',
+    setTeaWarning:'请设置教师',
+    mon:'星期一',
+    tue:'星期二',
+    wed:'星期三',
+    thu:'星期四',
+    fri:'星期五',
+    sat:'星期六',
+    sun:'星期日',
+    
 }
 }

+ 351 - 385
TEAMModelOS/ClientApp/src/locale/lang/en-US/studentWeb.js

@@ -1,418 +1,384 @@
 export default {
 export default {
-    "home": {
-        "teacher": "teacher",
-        "student": "student",
-        "setting": "Personal Settings",
-        "logout": "Logout",
-        "joinClass": "Join Class",
-        "exam": "evaluation",
-        "vote": "Vote",
-        "survey": "Questionnaire",
+    home: {
+        teacher: 'Teacher',
+        student: 'Student',
+        setting: 'Personal setting',
+        logout: 'Logout',
+        joinClass: 'Join class',
+        exam: 'assessment',
+        vote: 'Vote',
+        survey: 'Questionnaire'
     },
     },
-    "public": {
-        "going": "In progress",
-        "finish": "Finished",
-        "schoolExam": "School Level Evaluation",
-        "privateExam": "Personal Evaluation",
-        "schoolVote": "School-level voting",
-        "privateVote": "Private Vote",
-        "schoolSurvey": "School Level Questionnaire",
-        "privateSurvey": "Personal Survey",
-        "search": "Please enter search content..."
+    public: {
+        noData: 'No data temporarily',
+        going: 'In progress',
+        finish: 'Ended',
+        schoolExam: 'School-level evaluation',
+        privateExam: 'Personal evaluation',
+        schoolVote: 'School-level voting',
+        privateVote: 'Personal vote',
+        schoolSurvey: 'School Level Questionnaire',
+        privateSurvey: 'Personal Questionnaire',
+        search: 'Please enter the query content...'
     },
     },
-    "event": {
-        "allStatus": "All Activity Status",
-        "unFinished": "Unfinished",
-        "Fineshed": "Finished",
-        "Timeout": "Timeout",
-        "makeupExam": "Makeup Exam",
-        "makeupHw": "Makeup available",
-        "selectActivity": "Please select an activity from the list",
-        "allSubject": "All Subjects"
+    event: {
+        allStatus: 'All activity status',
+        unFinished: 'Unfinished',
+        Fineshed: 'Completed',
+        Timeout: 'Timeout',
+        makeupExam: 'Can make up the exam',
+        makeupHw: 'Can make up',
+        selectActivity: 'Please select an activity from the list',
+        allSubject: 'Comprehensive subjects'
     },
     },
-    "settingView-title": "Personal Settings",
-    "teammodel-account-management": {
-        "page-title": "TeamModel Account Management",
-        "name": "Name",
-        "account": "Account",
-        "password": "Password",
-        "phone": "Mobile Number",
-        "e-mail": "E-mail",
-        "binding": "Binding Management",
-        "isbind": "Bind",
-        "unbind": "Unbind",
-        "save": "Save settings"
+    'settingView-title': 'Personal settings',
+    'teammodel-account-management': {
+        'page-title': 'TeamModel account management',
+        name: 'Name',
+        account: 'Account',
+        password: 'Password',
+        phone: 'Mobile phone number',
+        'e-mail': 'E-mail',
+        binding: 'Binding Management',
+        isbind: 'Bind',
+        unbind: 'Unbind',
+        save: 'Save settings'
     },
     },
-    "preference": {
-        "page-title": "Preferences",
-        "UI-theme": "Interface Style Settings",
-        "language": "Language Setting"
+    preference: {
+        'page-title': 'Preferences',
+        'UI-theme': 'Interface style settings',
+        language: 'Language Setting'
     },
     },
-    "change-school": {
-        "page-title": "Switch school",
-        "current-data-school": "Current data source school",
-        "Habook-smart-school": "Habook Smart School"
+    'change-school': {
+        'page-title': 'Switch school',
+        'current-data-school': 'Current data source school',
+        'Habook-smart-school': 'Habook Smart School'
     },
     },
-    "homeView-title": "Homepage Information Overview",
-    "calenderCardTitle": "Calendar",
-    "recentClass": "Recent Class Reminder",
-    "defaultRecentClass": "Introduction to Microprocessor Basics and Applications",
-    "defaultClassTime": "Wednesday 13:30-16:30 (Sections 7-9)",
-    "defaultClassPlace": "F504 Classroom in the Fifth Teaching Building",
-    "todaydeadlineList": "Today Deadline Event Reminder",
-    "endsTodayTime": "Ends Today at 23:59",
-    "coursesCardTitle": "My Course List",
-    "newAddCourse": "The latest addition: Elective Mathematics (2)",
-    "missionListCardTitle": "Activity Task List",
-    "missionListCardLoading": "Loading",
-    "missionListCardReachBottom": "It's the bottom, no activity!",
-    "myProgressBar": {
-        "tasksCompletionRate": "Activity task completion rate",
-        "selfStudyClickRate": "Self-study textbook click rate"
+    'homeView-title': 'Home page information overview',
+    calenderCardTitle: 'Calendar',
+    recentClass: 'Recent class reminder',
+    defaultRecentClass: 'Introduction to Microprocessor Basics and Applications',
+    defaultClassTime: 'Wednesday 13:30-16:30 (Sections 7-9)',
+    defaultClassPlace: 'F504 classroom in the fifth teaching building',
+    todaydeadlineList: 'Today deadline event reminder',
+    endsTodayTime: 'ends today at 23:59',
+    coursesCardTitle: 'My Course List',
+    newAddCourse: 'The latest addition: Elective Mathematics (2)',
+    missionListCardTitle: 'Activity Task List',
+    missionListCardLoading: 'Loading',
+    missionListCardReachBottom: 'It the bottom, no activity! ',
+    myProgressBar: {
+        tasksCompletionRate: 'Activity task completion rate',
+        selfStudyClickRate: 'Self-study textbook click rate'
     },
     },
-    "chartNames": [
-        "Average self-study time",
-        "Monthly self-study hour curve for this semester",
-        "Comparison of the number of activity participation between me and my grade last month",
-        "Comparison chart of average daily self-study time and the whole year level",
-        "Percentage of participation time of various activities and tasks this month",
-        "Self-study activity"
+    chartNames: [
+        'Average self-study time',
+        'Curve of self-study hours per month in this semester',
+        'Last month I compared the number of activities I participated in with my grade',
+        'Comparison of the average daily self-study time and the whole year level',
+        'Percentage of participation time of various activities and tasks this month',
+        'Self-study activity'
     ],
     ],
-    "studyTimeChart": {
-        "averageTime": "Minutes/Day",
-        "xAxisData": [
-            "day",
-            "One",
-            "two",
-            "three",
-            "four",
-            "Fives",
-            "six"
+    studyTimeChart: {
+        averageTime: 'minutes/day',
+        xAxisData: [
+            'day',
+            'One',
+            'two',
+            'three',
+            'four',
+            'Fives',
+            'six'
         ]
         ]
     },
     },
-    "splineSreaChart": {
-        "xAxisData": [
-            "February",
-            "March",
-            "April",
-            "May",
-            "June"
+    splineSreaChart: {
+        xAxisData: [
+            'February',
+            'March',
+            'April',
+            'May',
+            'June'
         ]
         ]
     },
     },
-    "stackBarChart": {
-        "chartMon": "May",
-        "yAxisData": [
-            "I (third grade)",
-            "Third grade",
-            "second grade",
-            "ㄧ Grade"
+    stackBarChart: {
+        chartMon: 'May',
+        yAxisData: [
+            'I (third grade)',
+            'Third grade',
+            'second grade',
+            'Year Grade'
         ],
         ],
-        "stackType": [
-            "operation",
-            "Assessment",
-            "Pre-Class Preview",
-            "vote"
+        stackType: [
+            'operation',
+            'Assessment',
+            'Pre-class preview',
+            'vote'
         ]
         ]
     },
     },
-    "twoLineChart": {
-        "xAxisData": [
-            "day",
-            "ㄧ",
-            "two",
-            "three",
-            "four",
-            "Fives",
-            "six"
+    twoLineChart: {
+        xAxisData: [
+            'day',
+            'ㄧ',
+            'two',
+            'three',
+            'four',
+            'Fives',
+            'six'
         ]
         ]
     },
     },
-    "eventPieChart": {
-        "partType": [
-            "operation",
-            "Assessment",
-            "Pre-Class Preview",
-            "vote"
+    eventPieChart: {
+        partType: [
+            'operation',
+            'Assessment',
+            'Pre-class preview',
+            'vote'
         ]
         ]
     },
     },
-    "studyHeatMap": {
-        "xAxisData": [
-            "ㄧ",
-            "two",
-            "three",
-            "four",
-            "Fives"
+    studyHeatMap: {
+        xAxisData: [
+            'ㄧ',
+            'two',
+            'three',
+            'four',
+            'Fives'
         ]
         ]
     },
     },
-    "latestNotification": "Latest Notification",
-    "postAt": "Post At",
-    "______________": "______________",
-    "eventView-title": "Activity Task",
-    "nextTask": "Next Task",
-    "allStatus": "All Activity Status",
-    "unFinished": "Unfinished",
-    "Fineshed": "Finished",
-    "Timeout": "Timeout",
-    "makeupExam": "Makeup Exam",
-    "makeupHW": "Makeup available",
-    "empty": "There is currently no data ~",
-    "baseInfo": {
-        "subject": "Subject:",
-        "teacher": "Teacher:",
-        "period": "Activity period:",
-        "postTime": "Post Time:",
-        "classTime": "Class Time",
-        "unFinished": "Unfinished",
-        "Fineshed": "Finished",
-        "Closed": "Closed"
+    latestNotification: 'Latest notification',
+    postAt: 'Posted on',
+    vote: {
+        bollotbox: 'Voting area',
+        submit: 'OK to submit',
+        reVote: 'Vote again',
+        voteSuccess: 'Vote successful',
+        voteDes: 'After the event is over, you can view everyone vote results',
+        timeoutHint: 'Voting time has passed, no more voting, please pay attention to the teacher release of the voting results! ',
+        voteResult: 'The result of this vote is:',
+        voteDesDefault: 'Please choose a desired plan:',
+        tickets: 'ticket',
+        surplusTickets: 'Remaining votes',
+        submitBVote: 'Submit to vote',
+        note: 'Please select at least one option before you vote! ',
+        warning: 'Voting failed, please check the voting information! ',
+        warning2: 'The maximum number of votes has been exceeded! ',
+        voteRes: 'Voting results',
+        voteRecord: 'Vote Record'
     },
     },
-    "billboard": {
-        "description": "Description",
-        "referlink": "referlink data",
-        "attachment": "Attachment",
-        "reference": "reference"
+    homework: {
+        homeworkUpload: 'Job upload area',
+        homeworkUoloadBtn: 'Upload job',
+        homeworkReUoloadBtn: 'Re-upload',
+        CommentClassmatesHomeworkBtn: 'Classmates homework observation and mutual evaluation',
+        uploadSuccess: 'Upload successful',
+        uploadDes: 'After the activity is over, you can view the homework score comments',
+        timeoutHint: 'The homework upload time has ended. The homework score will be calculated as 0 points, or wait for the teacher to open it up. ',
+        contentPage: 'Job content',
+        scorePage: 'Score Comment',
+        score: 'Teacher score',
+        classmatesComments: 'Classmates give comments',
+        comment: 'Give a comment: '
     },
     },
-    "preview": {
-        "checkpoint": "Activity Task",
-        "tutorial": "Programming Textbook",
-        "multiQues": "Multi-question pass module",
-        "previewContent": {
-            "tutorial": "Textbook",
-            "Des": "Content",
-            "Unit": "Unit",
-            "quiz": "Examination in the classroom"
-        },
-        "previous": "Previous Question",
-        "next": "Next Question",
-        "sentAns": "Sent Ans",
-        "tryAgain": "Read the textbook carefully, try again",
-        "nextUnit": "Next Unit",
-        "goHome": "Go Home",
-        "quizRetries": "Quiz Retries",
-        "crossUnitHint": "The last unit test has not been completed. Please complete it before proceeding to this unit test",
-        "timeoutHint": "The pre-class preview activity time has ended, and textbook reading and practice can still be carried out. If it is not completed before the end time, relevant results may be affected."
-    },
-    "vote": {
-        "bollotbox": "Voting Area",
-        "submit": "OK to submit",
-        "reVote": "Vote again",
-        "voteSuccess": "Vote successful",
-        "voteDes": "After the event is over, you can view everyone's voting results",
-        "timeoutHint": "The voting time has passed, and no more voting is possible. Please pay attention to the teacher's release of the voting results!",
-        "voteResult": "The result of this vote is:",
-        "voteDesDefault": "Please select a desired plan:",
-        "tickets": "Tickets",
-        "surplusTickets": "Remaining Tickets",
-        "submitBVote": "Submit to vote",
-        "note": "Please select at least one option before you vote!",
-        "warning": "Voting failed, please check the voting information!",
-        "warning2": "The maximum number of votes has been exceeded!",
-        "voteRes": "Voting Results",
-        "voteRecord": "Vote Record"
-    },
-    "homework": {
-        "homeworkUpload": "Homework Upload Area",
-        "homeworkUoloadBtn": "Upload job",
-        "homeworkReUoloadBtn": "Re-upload",
-        "CommentClassmatesHomeworkBtn": "CommentClassmatesHomeworkBtn",
-        "uploadSuccess": "Upload successful",
-        "uploadDes": "After the activity is over, you can view the assignment score comments",
-        "timeoutHint": "The time for uploading the homework has ended. The grade of this homework will be calculated as 0 points, or waiting for the teacher to open it up.",
-        "contentPage": "Job Content",
-        "scorePage": "Score Comment",
-        "score": "Teacher Score",
-        "classmatesComments": "Classmates Comment",
-        "comment": "Give comment: "
+    classmatesComment: {
+        title: 'Classmates homework observation and mutual evaluation',
+        seatNo: 'seat number',
+        name: 'Name',
+        star: 'star',
+        comment: 'Give a comment',
+        preview: 'Operation preview: file name',
+        unPreview: 'The format of this file currently does not provide preview',
+        download: 'Download file',
+        submitted: 'Submit',
+        inputSomething: 'Input comments and other suggestions',
+        previous: 'Previous',
+        next: 'Next',
+        submitBtn: 'Submit'
     },
     },
-    "classmatesComment": {
-        "title": "Classmates' work observation and mutual evaluation",
-        "seatNo": "seatNo",
-        "name": "Name",
-        "star": "Star",
-        "comment": "Give comment",
-        "preview": "Job Preview: File Name",
-        "unPreview": "This file format does not currently provide preview",
-        "download": "Download File",
-        "submitted": "Submitted",
-        "inputSomething": "Input comments and other suggestions",
-        "previous": "Previous",
-        "next": "Next",
-        "submitBtn": "Submit"
-    },
-    "exam": {
-        "examLink": "Exam Link",
-        "isSubject": "",
-        "subjectNow": "Subject",
-        "examData": "Evaluation Content",
-        "gradeReport": "Grade Report",
-        "gradeAnalyse": "Grade Analysis",
-        "testpop": {
-            "title": "assessment",
-            "completion": "Completion Degree",
-            "practiceMode": "Practice Mode",
-            "all": "Practice all",
-            "onlywrong": "Only practice answering wrong answers",
-            "questions": "Questions",
-            "submitted": "Submitted",
-            "finish": "Finished",
-            "showAns": "Show Answers",
-            "hideAns": "Hide the answer",
-            "hint": "Key Tips",
-            "previous": "Previous Question",
-            "next": "Next Question",
-            "myAnswerSheet": "My Answer Sheet",
-            "exitQuizhint": "Exit Quizhint",
-            "exitQuizhintDe": "The system has detected that you have not yet 'submitted', if you choose 'OK',",
-            "exitQuizhintDes": "The current answer will not be saved, and the test will be re-tested next time",
-            "cancel": "Cancel",
-            "ok": "OK",
-            "submitQuizhint": "Submit Quizhint",
-            "submitQuizhintDes1": "The system test has been completed so far. Are you sure to submit the paper?",
-            "check": "No, need to check again",
-            "conAnswer0": "Currently you have",
-            "conAnswer1": "The question has not been answered (check the answer card in detail)",
-            "conAnswer2": ", please complete the question first!",
-            "conAnswer": "Continue to answer",
-            "okSubmit": "Confirm to submit the paper",
-            "qNo": "Question Number:",
-            "myAns": "Answer",
-            "correction": "正解",
-            "queNo": "Title:",
-            "myAns": "My answer:"
+    exam: {
+        examLink: 'test paper link',
+        isSubject: 'Subject paper',
+        subjectNow: 'Current subject',
+        examData: 'evaluation content',
+        gradeReport: 'Score report',
+        gradeAnalyse: 'Score Analysis',
+        queType: {
+            single: 'Single choice question',
+            multiply: 'Multiple Choice Questions',
+            judge: 'Judgement question',
+            complete: 'Fill in the blanks',
+            subjective: 'Question and Answer Question',
+            compose: 'Comprehensive questions',
+            correct: 'Correct the wrong question',
+            connector: 'Connection question'
+        },
+        submitSuccess: 'The answer information was submitted successfully! ',
+        submitFail: 'Failed to save the answer information! ',
+        msgWarning: 'The answer message is wrong! ',
+        testpop: {
+            title: 'Assessment',
+            completion: 'Completion degree',
+            practiceMode: 'Practice Mode',
+            all: 'Practice all',
+            onlywrong: 'Only practice the wrong answer',
+            questions: 'The question',
+            submitted: 'Submission of paper',
+            finish: 'Completed',
+            showAns: 'Show answers',
+            hideAns: 'Hide the answer',
+            hint: 'Key hint',
+            previous: 'Previous question',
+            next: 'Next question',
+            myAnswerSheet: 'My Answer Sheet',
+            exitQuizhint: 'Leave Quiz Prompt',
+            exitQuizhintDe: 'The system has detected that you have not yet "turned in", if you choose "OK",',
+            exitQuizhintDes: 'The current answer will not be saved, and the test will need to be re-tested next time',
+            cancel: 'Cancel',
+            ok: 'OK',
+            submitQuizhint: 'Reminder for submission of papers',
+            submitQuizhintDes1: 'At present, you have completed the system test. Are you sure to submit the paper? ',
+            check: 'No, need to check again',
+            conAnswer0: 'Currently you have',
+            conAnswer1: 'The question is not answered (check the answer card in detail)',
+            conAnswer2: ', please complete the question first! ',
+            conAnswer: 'Continue to answer',
+            okSubmit: 'Confirm to submit the paper',
+            qNo: 'Question number:',
+            correction: 'right',
+            queNo: 'Title:',
+            myAns: 'My answer:'
         },
         },
-        "report": {
-            "anwser": "Go to answer",
-            "noRes": "The results have not yet been settled",
-            "getScore": "Number of score questions",
-            "answerBack": "Review of the review and answer",
-            "right": "Right",
-            "wrong": "Wrong ",
-            "noScore": "Not Review",
-            "ansRes": "Response result",
-            "testAns": "Reference Answer",
-            "testAnalyse": "Analyze",
-            "repairSource": "Repair Source",
-            "noAns": "No Answer",
-            "linkSource": "Network Resources",
-            "noSource": "No Resources",
-            "fileSource": "File Source",
-            "fileView": "File Preview",
-            "noReview": "This file does not support preview, please download and view!",
-            "pdfErr": "'pdf failed to load'",
-            "noAnalyse": "No analysis yet"
+        report: {
+            anwser: 'Go to answer',
+            noRes: 'Results have not been settled',
+            getScore: 'Number of score questions',
+            answerBack: 'Review of the review and answer',
+            right: 'Answer right',
+            wrong: 'Wrong answer',
+            noScore: 'Not scored',
+            ansRes: 'result of answer',
+            testAns: 'reference answer',
+            testAnalyse: 'Analyze',
+            repairSource: 'remediation resource',
+            noAns: 'No answer',
+            linkSource: 'Network Resources',
+            noSource: 'No resource temporarily',
+            fileSource: 'File Resource',
+            fileView: 'File Preview',
+            noReview: 'This file does not support preview, please download and view! ',
+            pdfErr: 'pdf loading failed',
+            noAnalyse: 'No analysis yet'
         },
         },
-        "timeoutHint": "The evaluation activity time has ended. Overtime will be calculated as 0 points, or wait for the teacher to open the make-up exam.",
-        "contentPage": "Review Content",
-        "scorePage": "Score Report",
-        "practiceHint": "The assessment activity time has ended, you can still click on the test paper link to continue practicing.",
-        "performance": "performance",
-        "reviewAnswers": "Review of answering status",
-        "Chinese": "国文",
-        "Math": "Mathematics",
-        "English": "英文",
-        "score": "Score",
-        "difficulty": "Comprehensive difficulty of examination questions",
-        "average": "Class average score",
-        "rightNum": "The number of my correct answers",
-        "smartComment": "Smart Comment",
-        "keypoint": "Recommended knowledge points for review:",
-        "chart": {
-            "scoreDistribution": "Score Distribution Chart",
-            "participant": "Number of candidates:",
-            "student": "person",
-            "keyPointPerformance": "Knowledge Point Performance Radar Chart",
-            "me": "Individual",
-            "participantAverage": "The whole school",
-            "recognizePerformance": "Recognition Level Radar Chart"
+        timeoutHint: 'The evaluation activity time has ended. Overtime will be calculated as 0 points, or wait for the teacher to open the make-up exam. ',
+        contentPage: 'Review content',
+        scorePage: 'Score report',
+        practiceHint: 'Assessment activity time has ended, you can still click on the test paper link to continue practicing. ',
+        performance: 'Score performance',
+        reviewAnswers: 'Review of answering status',
+        Chinese: '国文',
+        Math: 'Mathematics',
+        English: 'English',
+        score: 'Score',
+        difficulty: 'Comprehensive difficulty of exam questions',
+        average: 'Class average score',
+        rightNum: 'The number of my correct answers',
+        smartComment: 'Smart Comment',
+        keypoint: 'Recommended knowledge points for review:',
+        chart: {
+            scoreDistribution: 'Assessment score distribution map',
+            participant: 'Number of candidates:',
+            student: 'person',
+            keyPointPerformance: 'Knowledge point performance radar chart',
+            me: 'personal',
+            participantAverage: 'The whole school',
+            recognizePerformance: 'Cognitive Level Radar Chart'
         },
         },
-        "studentScore": {
-            "examName": "Exam Name",
-            "examType": "Exam Type",
-            "stableIndex": "Learning stability coefficient",
-            "name": "Name",
-            "stuNo": "Student Number",
-            "class": "class",
-            "allSubScore": "All Subject Scores",
-            "total": "Personal Total Score",
-            "cAverages": "Class Averages",
-            "gAverages": "Grade Averages",
-            "aAverages": "District Averages",
-            "cIndex": "Class Ranking",
-            "gIndex": "Grade Ranking",
-            "aIndex": "District Rank",
-            "onLine": "Whether to enter the line",
-            "subject": "Subject",
-            "score": "Personal Score",
-            "cAverage": "Class Average",
-            "gAverage": "Grade Average",
-            "aAverage": "District-level average",
-            "rAns": "The number of correct answers",
-            "wAns": "Number of wrong answers",
-            "comIndex": "Comprehensive Difficulty",
-            "objItem": "Objective",
-            "subItem": "Subjective",
-            "subjects": "Subjects",
-            "item": "Title",
-            "objItems": "Objective Questions",
-            "subItems": "Subjective questions",
-            "itemIndex": "item number",
-            "standardIndex": "standard answer/partition points",
-            "stuAnsIndex": "Student answer/score",
-            "notice": "【-】--correct answer, 【#】--not answered, 【?】--multiple choice question",
-            "gradeErr": "The grade information is wrong!"
+        studentScore: {
+            examName: 'Exam Name',
+            examType: 'Exam Type',
+            stableIndex: 'Learning stability coefficient',
+            name: 'Name',
+            stuNo: 'Student ID',
+            class: 'Class',
+            allSubScore: 'Full Subject Score',
+            total: 'Personal total score',
+            cAverages: 'Class average score',
+            gAverages: 'Grade Average Score',
+            aAverages: 'District average score',
+            cIndex: 'Class Ranking',
+            gIndex: 'grade ranking',
+            aIndex: 'District rank',
+            onLine: 'Whether to enter the line',
+            subject: 'Subject',
+            score: 'Personal score',
+            cAverage: 'Class average',
+            gAverage: 'Grade Average',
+            aAverage: 'District average',
+            rAns: 'Number of correct answers',
+            wAns: 'Number of wrong answers',
+            comIndex: 'comprehensive difficulty',
+            objItem: 'Objective',
+            subItem: 'Subjective',
+            subjects: 'Subjects',
+            item: 'Title',
+            objItems: 'Objective questions',
+            subItems: 'Subjective questions',
+            itemIndex: 'Question Number',
+            standardIndex: 'standard answer/partition points',
+            stuAnsIndex: 'Student answer/score',
+            notice: '【-】--correct answer, 【#】--no answer, 【?】--multiple choice question',
+            gradeErr: 'The grade information is wrong! '
         },
         },
-        "correctAnswer": "correctAnswer",
-        "wrongAnswer": "Wrong Answer",
-        "unAnswered": "Unanswered",
-        "solution": "Solution",
-        "analysis": "Analysis",
-        "correctRate": "correct rate",
-        "relatedAQues": "Related Questions",
-
+        'correctAnswer': 'correct answer',
+        wrongAnswer: 'Wrong answer',
+        unAnswered: 'Unanswered',
+        solution: 'Solution',
+        analysis: 'Analysis',
+        correctRate: 'correct answer rate',
+        relatedAQues: 'Related Questions'
     },
     },
-    "informview-title": "Notification Overview",
-    "view": "Go to view",
-    "read": "Read",
-    "studyview-title": "self-study",
-    "hiteachview-title": "HiTeach Class Record",
-    "hiteachNote": {
-        "material": "Class Content",
-        "classInteractionRecord": "Class Interaction Record",
-        "qA": "Question and Answer",
-        "qAMulti": "Question and Answer (Multiple Choice)",
-        "reference": "reference answer",
-        "correct": "The answer is correct",
-        "groupQAMulti": "Group QAMulti (multiple choice)",
-        "poImg": "The teacher pushed a picture from Hitach:",
-        "link": "Share Link"
+    'informview-title': 'Notification overview',
+    view: 'Go to view',
+    read: 'Read',
+    'studyview-title': 'self-study',
+    'hiteachview-title': 'HiTeach class record',
+    hiteachNote: {
+        material: 'Class content',
+        classInteractionRecord: 'Class Interaction Record',
+        qA: 'Quick and answer',
+        qAMulti: 'Quick and answer (multiple choice)',
+        reference: 'Reference answer',
+        correct: 'The answer is correct',
+        groupQAMulti: 'Group QAMulti (multiple choice)',
+        poImg: 'The teacher pushed a picture from Hitach:',
+        link: 'Share link'
     },
     },
-    "courseList-title": "My Course List",
-    "defaultClass": "Specify a class",
-    "tempClass": "Temporary Class",
-    "courseContent": {
-        "baseInfo": "Basic Information",
-        "description": "Course Overview",
-        "classmates": "Classmates List",
-        "classID": "Course Code",
-        "classTime": "Class Time",
-        "classroom": "Classroom",
-        "teacher": "Teacher",
-        "co-teacher": "Co-teacher",
-        "addedTime": "Added Course Date",
-        "syllabus": "Syllabus Overview",
-        "seatNo": "seatNo",
-        "name": "Name",
-        "group": "Group"
+    'courseList-title': 'My Course List',
+    defaultClass: 'table set course',
+    tempClass: 'temporary class',
+    courseContent: {
+        baseInfo: 'Basic Information',
+        description: 'Course Overview',
+        classmates: 'Classmates list',
+        classID: 'Course Code',
+        classTime: 'Class Time',
+        classroom: 'Classroom',
+        teacher: 'Teaching teacher',
+        'co-teacher': 'co-teacher',
+        addedTime: 'Join the course date',
+        syllabus: 'Syllabus overview',
+        seatNo: 'seat number',
+        name: 'Name',
+        group: 'Group'
     },
     },
-    "calendar-title": "Calendar-Second Semester of 109 School Year",
-    "today": "Today",
-    "importEvent": "Campus Class Important Events",
-    "deadlineTasks": "Deadline Tasks",
-    "schedule": "Schedule Schedule",
-    "des": "Description",
-    "time": "Time",
-    "place": "Location",
-    "course": "course",
-    "mockcourses": ["Reading and Writing", "English Presentation", "Special Experiments on Electronic Circuits", "Introduction to Computers", "Microprocessor Experiments"],
-    "importEventTitle": "Campus Class Important Events",
-    "Thatday": "Thatday",
-    "deadlineTasksTitle": "DeadlineTasksTitle"
+    'calendar-title': 'Calendar-Second semester of 109 school year',
+    today: 'Today',
+    importEvent: 'Campus Class Important Events',
+    deadlineTasks: 'Deadline activity tasks',
+    schedule: 'Schedule scheduled',
+    des: 'Description',
+    time: 'Time',
+    place: 'Location',
+    course: 'Course',
+    mockcourses: ['Reading and Writing', 'English Presentation', 'Special Experiments on Electronic Circuits', 'Introduction to Computers', 'Microprocessor Experiments'],
+    importEventTitle: 'Campus Class Important Events',
+    Thatday: 'The day',
+    deadlineTasksTitle: 'Activity tasks are not completed at the end of the day'
 }
 }

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/cusMgt.js

@@ -204,4 +204,23 @@ export default {
     nameTips:'请输入节点名称',
     nameTips:'请输入节点名称',
     typeTips:'请设置节点类型',
     typeTips:'请设置节点类型',
     startTips:'请设置时间',
     startTips:'请设置时间',
+
+    //CoursePlan.vue
+    cusTable:'课程表',
+    importLabel:'导入课表',
+    cusMode:'课程模式',
+
+    //ClassTable.vue
+    noAddTea:'当前课程未添加授课老师',
+    sltCusTips:'请先选择课程',
+    setCusWarning:'请设置课程',
+    setTeaWarning:'请设置教师',
+    mon:'星期一',
+    tue:'星期二',
+    wed:'星期三',
+    thu:'星期四',
+    fri:'星期五',
+    sat:'星期六',
+    sun:'星期日',
+
 }
 }

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

@@ -30,7 +30,7 @@ import survey from './survey'
 import updModal from './updModal'
 import updModal from './updModal'
 import http from './http'
 import http from './http'
 import utils from './utils'
 import utils from './utils'
-
+import knowledge from './knowledge'
 export default {
 export default {
   schoolBaseInfo,
   schoolBaseInfo,
   classMgmt,
   classMgmt,
@@ -64,6 +64,7 @@ export default {
   updModal,
   updModal,
   http,
   http,
   utils,
   utils,
+  knowledge,
   test: '测试',
   test: '测试',
   formConfigP: {
   formConfigP: {
     input: '请输入',
     input: '请输入',

+ 58 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/knowledge.js

@@ -0,0 +1,58 @@
+export default {
+    subject: '科目',
+    label: '名称',
+    blockP: '请输入知识块名称',
+    confirm: '确认',
+    blockWarning: '知识块名称不能为空!',
+    block: '知识块',
+    knowledgeP: '请输入知识点名称,必填项',
+    knowledgeWarning: '知识点名称不能为空!',
+    newBlock: '新增知识块',
+    addBlock: '添加知识块',
+    inputBlock: '输入知识块名称',
+    nowBlock: '现有知识块',
+    nowBlockN: '选择知识块 ( *若所选知识块内已存在添加的知识点则会覆盖 )',
+    selectPoint: '已选知识点',
+    blockWarning2: '已存在同名知识块,请修改名称!',
+    blockWarning3: '知识块名称不能为空',
+    blockWarning4: '无现有知识块选择',
+    period: '当前学段',
+    searchSubject: '搜索学科...',
+    blockCount: '知识块数',
+    point: '知识点',
+    searchPoint: '搜索知识点...',
+    makeBlock: '组成知识块',
+    edit: '编辑',
+    delete: '删除',
+    moveBlock: '移出知识块',
+    searchBlock: '搜索知识块',
+    buildBlock: '新建知识块',
+    pointCount: '知识点数:',
+    editBlock: '编辑知识块',
+    addPoint: '新增知识点',
+    editPoint: '编辑知识点',
+    cancel: '取消',
+    notice: '提示',
+    content0: '确定将',
+    content2: '等',
+    content3: '个知识点移入到知识块',
+    content1: '中(*已存在的知识点会自动忽略)',
+    notice1: '所选知识点已存在该知识块中',
+    notice2: '该知识块已存在当前知识点',
+    content4: '确定将知识点',
+    content5: '移入到知识块',
+    content6: '中?',
+    success: '操作成功!',
+    fail: '操作失败!',
+    warn: '知识块数据获取失败',
+    delBlock: '确认删除该知识块?',
+    delSuccess: '删除成功',
+    delFail: '删除失败',
+    delPoint: '确认删除该知识点?',
+    content7: '确定将知识点',
+    content8: '从知识块',
+    content9: '中移出',
+    moveFail: '移出失败',
+    saveSuccess: '保存数据成功!',
+    saveFail: '保存数据失败!'
+}

+ 405 - 394
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/studentWeb.js

@@ -1,431 +1,442 @@
 export default {
 export default {
-    "home": {
-        "teacher": "教师",
-        "student": "学生",
-        "setting": "个人设定",
-        "logout": "登出",
-        "joinClass": "加入课程",
-        "exam": "评量",
-        "vote": "投票",
-        "survey": "问卷",
+    home: {
+        teacher: '教师',
+        student: '学生',
+        setting: '个人设定',
+        logout: '登出',
+        joinClass: '加入课程',
+        exam: '评量',
+        vote: '投票',
+        survey: '问卷'
     },
     },
-    "public": {
-        "noData":"暂无数据",
-        "going": "进行中",
-        "finish": "已结束",
-        "schoolExam": "校级评测",
-        "privateExam": "个人评测",
-        "schoolVote": "校级投票",
-        "privateVote": "个人投票",
-        "schoolSurvey": "校级问卷",
-        "privateSurvey":"个人问卷",
-        "search":"请输入查询内容..."
+    public: {
+        noData: '暂无数据',
+        going: '进行中',
+        finish: '已结束',
+        schoolExam: '校级评测',
+        privateExam: '个人评测',
+        schoolVote: '校级投票',
+        privateVote: '个人投票',
+        schoolSurvey: '校级问卷',
+        privateSurvey: '个人问卷',
+        search: '请输入查询内容...',
+        notice: '此功能暂未开放!'
     },
     },
-    "event": {
-        "allStatus": "所有活动状态",
-        "unFinished": "未完成",
-        "Fineshed": "已完成",
-        "Timeout": "已逾时",
-        "makeupExam": "可补考",
-        "makeupHw": "可补交",
-        "selectActivity": "请从列表挑选一个活动",
-        "allSubject":"综合科目"
+    event: {
+        allStatus: '所有活动状态',
+        unFinished: '未完成',
+        Fineshed: '已完成',
+        Timeout: '已逾时',
+        makeupExam: '可补考',
+        makeupHw: '可补交',
+        selectActivity: '请从列表挑选一个活动',
+        allSubject: '综合科目'
     },
     },
-    "settingView-title": "个人设定",
-    "teammodel-account-management": {
-        "page-title": "TeamModel 帐号管理",
-        "name": "姓名",
-        "account": "帐号",
-        "password": "密码",
-        "phone": "手机号码",
-        "e-mail": "E-mail",
-        "binding": "绑定管理",
-        "isbind": "绑定",
-        "unbind": "解除绑定",
-        "save": "储存设定"
+    'settingView-title': '个人设定',
+    'teammodel-account-management': {
+        'page-title': 'TeamModel 帐号管理',
+        name: '姓名',
+        account: '帐号',
+        password: '密码',
+        phone: '手机号码',
+        'e-mail': 'E-mail',
+        binding: '绑定管理',
+        isbind: '绑定',
+        unbind: '解除绑定',
+        save: '储存设定'
     },
     },
-    "preference": {
-        "page-title": "偏好设定",
-        "UI-theme": "介面样式设定",
-        "language": "语系设定"
+    preference: {
+        'page-title': '偏好设定',
+        'UI-theme': '介面样式设定',
+        language: '语系设定'
     },
     },
-    "change-school": {
-        "page-title": "切换学校",
-        "current-data-school": "目前资料来源学校",
-        "Habook-smart-school": "Habook智慧校园"
+    'change-school': {
+        'page-title': '切换学校',
+        'current-data-school': '目前资料来源学校',
+        'Habook-smart-school': 'Habook智慧校园'
     },
     },
-    "homeView-title": "首页资讯总览",
-    "calenderCardTitle": "行事历",
-    "recentClass": "近期上课提醒",
-    "defaultRecentClass": "微处理机基础与应用概论",
-    "defaultClassTime": "星期三 13:30 - 16:30 (第7-9节)",
-    "defaultClassPlace": "第五教学楼 F504 教室",
-    "todaydeadlineList": "今日截止活动提醒 ",
-    "endsTodayTime": "今日23:59截止",
-    "coursesCardTitle": "我的课程清单",
-    "newAddCourse": "最新加入:选修数学(二)",
-    "missionListCardTitle": "活动任务清单",
-    "missionListCardLoading": "载入中",
-    "missionListCardReachBottom": "已经最底,没活动啦!",
-    "myProgressBar": {
-        "tasksCompletionRate": "活动任务完成率",
-        "selfStudyClickRate": "自学教材点阅率"
+    'homeView-title': '首页资讯总览',
+    calenderCardTitle: '行事历',
+    recentClass: '近期上课提醒',
+    defaultRecentClass: '微处理机基础与应用概论',
+    defaultClassTime: '星期三 13:30 - 16:30 (第7-9节)',
+    defaultClassPlace: '第五教学楼 F504 教室',
+    todaydeadlineList: '今日截止活动提醒 ',
+    endsTodayTime: '今日23:59截止',
+    coursesCardTitle: '我的课程清单',
+    newAddCourse: '最新加入:选修数学(二)',
+    missionListCardTitle: '活动任务清单',
+    missionListCardLoading: '载入中',
+    missionListCardReachBottom: '已经最底,没活动啦!',
+    myProgressBar: {
+        tasksCompletionRate: '活动任务完成率',
+        selfStudyClickRate: '自学教材点阅率'
     },
     },
-    "chartNames": [
-        "平均自学时间",
-        "本学期每月自学时数曲线",
-        "上月我与年级的活动参与数比较",
-        "每日平均自学时间与全年级比较图",
-        "本月各类活动任务参与时间占比",
-        "自学活跃度"
+    chartNames: [
+        '平均自学时间',
+        '本学期每月自学时数曲线',
+        '上月我与年级的活动参与数比较',
+        '每日平均自学时间与全年级比较图',
+        '本月各类活动任务参与时间占比',
+        '自学活跃度'
     ],
     ],
-    "studyTimeChart": {
-        "averageTime": "分/日",
-        "xAxisData": [
-            "日",
-            "一",
-            "二",
-            "三",
-            "四",
-            "五",
-            "六"
+    studyTimeChart: {
+        averageTime: '分/日',
+        xAxisData: [
+            '日',
+            '一',
+            '二',
+            '三',
+            '四',
+            '五',
+            '六'
         ]
         ]
     },
     },
-    "splineSreaChart": {
-        "xAxisData": [
-            "2月",
-            "3月",
-            "4月",
-            "5月",
-            "6月"
+    splineSreaChart: {
+        xAxisData: [
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月'
         ]
         ]
     },
     },
-    "stackBarChart": {
-        "chartMon": "5月",
-        "yAxisData": [
-            "我(三年级)",
-            "三年级",
-            "二年级",
-            "ㄧ年级"
+    stackBarChart: {
+        chartMon: '5月',
+        yAxisData: [
+            '我(三年级)',
+            '三年级',
+            '二年级',
+            'ㄧ年级'
         ],
         ],
-        "stackType": [
-            "作业",
-            "评量",
-            "课前预习",
-            "投票"
+        stackType: [
+            '作业',
+            '评量',
+            '课前预习',
+            '投票'
         ]
         ]
     },
     },
-    "twoLineChart": {
-        "xAxisData": [
-            "日",
-            "ㄧ",
-            "二",
-            "三",
-            "四",
-            "五",
-            "六"
+    twoLineChart: {
+        xAxisData: [
+            '日',
+            'ㄧ',
+            '二',
+            '三',
+            '四',
+            '五',
+            '六'
         ]
         ]
     },
     },
-    "eventPieChart": {
-        "partType": [
-            "作业",
-            "评量",
-            "课前预习",
-            "投票"
+    eventPieChart: {
+        partType: [
+            '作业',
+            '评量',
+            '课前预习',
+            '投票'
         ]
         ]
     },
     },
-    "studyHeatMap": {
-        "xAxisData": [
-            "ㄧ",
-            "二",
-            "三",
-            "四",
-            "五"
+    studyHeatMap: {
+        xAxisData: [
+            'ㄧ',
+            '二',
+            '三',
+            '四',
+            '五'
         ]
         ]
     },
     },
-    "latestNotification": "最新通知",
-    "postAt": "发布于",
-    "______________": "______________",
-    "eventView-title": "活动任务",
-    "nextTask": "下个活动",
-    "allStatus": "所有活动状态",
-    "unFinished": "未完成",
-    "Fineshed": "已完成",
-    "Timeout": "已逾时",
-    "makeupExam": "可补考",
-    "makeupHW": "可补交",
-    "empty": "目前无资料 ~",
-    "baseInfo": {
-        "subject": "科目:",
-        "teacher": "教师:",
-        "period": "活动期限:",
-        "postTime": "发布时间:",
-        "classTime": "上课时间",
-        "unFinished": "未完成",
-        "Fineshed": "已完成",
-        "Closed": "已结束"
+    latestNotification: '最新通知',
+    postAt: '发布于',
+    '______________': '______________',
+    'eventView-title': '活动任务',
+    nextTask: '下个活动',
+    allStatus: '所有活动状态',
+    unFinished: '未完成',
+    Fineshed: '已完成',
+    Timeout: '已逾时',
+    makeupExam: '可补考',
+    makeupHW: '可补交',
+    empty: '目前无资料 ~',
+    baseInfo: {
+        subject: '科目:',
+        teacher: '教师:',
+        period: '活动期限:',
+        postTime: '发布时间:',
+        classTime: '上课时间',
+        unFinished: '未完成',
+        Fineshed: '已完成',
+        Closed: '已结束'
     },
     },
-    "billboard": {
-        "description": "描述",
-        "referlink": "连结资料",
-        "attachment": "附件",
-        "reference": "参考资料"
+    billboard: {
+        description: '描述',
+        referlink: '连结资料',
+        attachment: '附件',
+        reference: '参考资料'
     },
     },
-    "preview": {
-        "checkpoint": "活动任务",
-        "tutorial": "编序教材",
-        "multiQues": "多题闯关模组",
-        "previewContent": {
-            "tutorial": "教材",
-            "Des": "内容",
-            "Unit": "单元",
-            "quiz": "随堂考"
+    preview: {
+        checkpoint: '活动任务',
+        tutorial: '编序教材',
+        multiQues: '多题闯关模组',
+        previewContent: {
+            tutorial: '教材',
+            Des: '内容',
+            Unit: '单元',
+            quiz: '随堂考'
         },
         },
-        "previous": "上一题",
-        "next": "下一题",
-        "sentAns": "送出答案",
-        "tryAgain": "详读教材,再试一次",
-        "nextUnit": "下一单元",
-        "goHome": "回到首页",
-        "quizRetries": "测验重试次数",
-        "crossUnitHint": "上个单元测验尚未完成,请先完成方可进行本单元测验",
-        "timeoutHint": "课前预习活动时间已结束,仍可进行教材阅读与练习,如于结束时间前未完成,相关成绩可能受到影响。"
+        previous: '上一题',
+        next: '下一题',
+        sentAns: '送出答案',
+        tryAgain: '详读教材,再试一次',
+        nextUnit: '下一单元',
+        goHome: '回到首页',
+        quizRetries: '测验重试次数',
+        crossUnitHint: '上个单元测验尚未完成,请先完成方可进行本单元测验',
+        timeoutHint: '课前预习活动时间已结束,仍可进行教材阅读与练习,如于结束时间前未完成,相关成绩可能受到影响。'
     },
     },
-    "vote": {
-        "bollotbox": "投票区",
-        "submit": "确定送出",
-        "reVote": "再次投票",
-        "voteSuccess": "投票成功",
-        "voteDes": "活动结束后,即可检视大家的投票结果",
-        "timeoutHint": "投票时间已过,无法再进行投票,敬请留意教师发布投票结果!",
-        "voteResult": "本次投票结果为:",
-        "voteDesDefault": "请选择一个想要的方案:",
-        "tickets": "票",
-        "surplusTickets": "剩余票数",
-        "submitBVote": "提交投票",
-        "note": "请至少选择一个选项,再进行投票!",
-        "warning": "投票失败,请检查投票信息!",
-        "warning2": "已超出最大投票数!",
-        "voteRes": "投票结果",
-        "voteRecord":"投票记录"
+    vote: {
+        bollotbox: '投票区',
+        submit: '确定送出',
+        reVote: '再次投票',
+        voteSuccess: '投票成功',
+        voteDes: '活动结束后,即可检视大家的投票结果',
+        timeoutHint: '投票时间已过,无法再进行投票,敬请留意教师发布投票结果!',
+        voteResult: '本次投票结果为:',
+        voteDesDefault: '请选择一个想要的方案:',
+        tickets: '票',
+        surplusTickets: '剩余票数',
+        submitBVote: '提交投票',
+        note: '请至少选择一个选项,再进行投票!',
+        warning: '投票失败,请检查投票信息!',
+        warning2: '已超出最大投票数!',
+        voteRes: '投票结果',
+        voteRecord: '投票记录',
+        voteTime: '投票时间'
     },
     },
-    "homework": {
-        "homeworkUpload": "作业上传区",
-        "homeworkUoloadBtn": "上传作业",
-        "homeworkReUoloadBtn": "重新上传",
-        "CommentClassmatesHomeworkBtn": "同学作业观摩互评",
-        "uploadSuccess": "上传成功",
-        "uploadDes": "活动结束后,即可检视作业成绩评语",
-        "timeoutHint": "作业上传时间已结束,本次作业成绩将以 0分 计算,或等候教师开放补交。",
-        "contentPage": "作业内容",
-        "scorePage": "成绩评语",
-        "score": "教师评分",
-        "classmatesComments": "同学给评",
-        "comment": "给评: "
+    homework: {
+        homeworkUpload: '作业上传区',
+        homeworkUoloadBtn: '上传作业',
+        homeworkReUoloadBtn: '重新上传',
+        CommentClassmatesHomeworkBtn: '同学作业观摩互评',
+        uploadSuccess: '上传成功',
+        uploadDes: '活动结束后,即可检视作业成绩评语',
+        timeoutHint: '作业上传时间已结束,本次作业成绩将以 0分 计算,或等候教师开放补交。',
+        contentPage: '作业内容',
+        scorePage: '成绩评语',
+        score: '教师评分',
+        classmatesComments: '同学给评',
+        comment: '给评: '
     },
     },
-    "classmatesComment": {
-        "title": "同学作业观摩与互评",
-        "seatNo": "座号",
-        "name": "姓名",
-        "star": "星级",
-        "comment": "给评",
-        "preview": "作业预览:档案名称",
-        "unPreview": "这个档案的格式目前不提供预览",
-        "download": "下载档案",
-        "submitted": "提交",
-        "inputSomething": "输入评语与其他建议",
-        "previous": "上一位",
-        "next": "下一位",
-        "submitBtn": "送出"
+    classmatesComment: {
+        title: '同学作业观摩与互评',
+        seatNo: '座号',
+        name: '姓名',
+        star: '星级',
+        comment: '给评',
+        preview: '作业预览:档案名称',
+        unPreview: '这个档案的格式目前不提供预览',
+        download: '下载档案',
+        submitted: '提交',
+        inputSomething: '输入评语与其他建议',
+        previous: '上一位',
+        next: '下一位',
+        submitBtn: '送出'
     },
     },
-    "exam": {
-        "examLink": "试卷链接",
-        "isSubject": "科试卷",
-        "subjectNow": "当前科目",
-        "examData": "评测内容",
-        "gradeReport": "成绩报告",
-        "gradeAnalyse": "成绩分析",
-        "queType": {
-            "single": "单选题",
-            "multiply": "多选题",
-            "judge": "判断题",
-            "complete": "填空题",
-            "subjective": "问答题",
-            "compose": "综合题",
-            "correct": "改错题",
-            "connector":"连线题"
+    exam: {
+        examLink: '试卷链接',
+        isSubject: '科试卷',
+        subjectNow: '当前科目',
+        examData: '评测内容',
+        gradeReport: '成绩报告',
+        gradeAnalyse: '成绩分析',
+        queType: {
+            single: '单选题',
+            multiply: '多选题',
+            judge: '判断题',
+            complete: '填空题',
+            subjective: '问答题',
+            compose: '综合题',
+            correct: '改错题',
+            connector: '连线题'
         },
         },
-        "submitSuccess": "作答信息提交成功!",
-        "submitFail": "作答信息保存失败!",
-        "msgWarning": "作答信息错误!",
-        "testpop": {
-            "title": "评量",
-            "completion": "完成度",
-            "practiceMode": "练习模式",
-            "all": "练习全部",
-            "onlywrong": "只练习答错",
-            "questions": "的题目",
-            "submitted": "交卷",
-            "finish":"已完成",
-            "showAns": "显示答案",
-            "hideAns": "隐藏答案",
-            "hint": "重点提示",
-            "previous": "上一题",
-            "next": "下一题",
-            "myAnswerSheet": "我的答题卡",
-            "exitQuizhint": "离开测验提示",
-            "exitQuizhintDe": "系统检测您尚未「交卷」,如您选择「确定」,",
-            "exitQuizhintDes": "则目前作答将不保存,下次需重新测验",
-            "cancel": "取消",
-            "ok": "确定",
-            "submitQuizhint": "交卷提示",
-            "submitQuizhintDes1": "系统检测目前您已全数作答完成,确定交卷吗?",
-            "check": "否,需再检查",
-            "conAnswer0": "目前您有",
-            "conAnswer1": "题 未作答 (详查答案卡)",
-            "conAnswer2":",请先完成题目作答!",
-            "conAnswer":"继续作答",
-            "okSubmit": "确定交卷",
-            "qNo": "题号:",
-            "myAns": "作答",
-            "correction": "正解",
-            "queNo": "题目:",
-            "myAns":"我的作答:"
+        submitSuccess: '作答信息提交成功!',
+        submitFail: '作答信息保存失败!',
+        msgWarning: '作答信息错误!',
+        testpop: {
+            title: '评量',
+            completion: '完成度',
+            practiceMode: '练习模式',
+            all: '练习全部',
+            onlywrong: '只练习答错',
+            questions: '的题目',
+            submitted: '交卷',
+            finish: '已完成',
+            showAns: '显示答案',
+            hideAns: '隐藏答案',
+            hint: '重点提示',
+            previous: '上一题',
+            next: '下一题',
+            myAnswerSheet: '我的答题卡',
+            exitQuizhint: '离开测验提示',
+            exitQuizhintDe: '系统检测您尚未「交卷」,如您选择「确定」,',
+            exitQuizhintDes: '则目前作答将不保存,下次需重新测验',
+            cancel: '取消',
+            ok: '确定',
+            submitQuizhint: '交卷提示',
+            submitQuizhintDes1: '系统检测目前您已全数作答完成,确定交卷吗?',
+            check: '否,需再检查',
+            conAnswer0: '目前您有',
+            conAnswer1: '题 未作答 (详查答案卡)',
+            conAnswer2: ',请先完成题目作答!',
+            conAnswer: '继续作答',
+            okSubmit: '确定交卷',
+            qNo: '题号:',
+            correction: '正解',
+            queNo: '题目:',
+            myAns: '我的作答:'
         },
         },
-        "report": {
-            "anwser": "前往作答",
-            "noRes": "成绩尚未结算",
-            "getScore": "得分题目数",
-            "answerBack": "评测作答回顾",
-            "right": "答对",
-            "wrong": "答错",
-            "noScore": "未评分",
-            "ansRes": "作答结果",
-            "testAns": "参考答案",
-            "testAnalyse": "解析",
-            "repairSource": "补救资源",
-            "noAns":"未作答",
-            "linkSource": "网络资源",
-            "noSource": "暂无资源",
-            "fileSource": "文件资源",
-            "fileView": "文件预览",
-            "noReview": "该文件暂不支持预览,请下载查看!",
-            "pdfErr":"'pdf 加载失败'",
-            "noAnalyse":"暂无解析"
+        report: {
+            anwser: '前往作答',
+            noRes: '成绩尚未结算',
+            getScore: '得分题目数',
+            answerBack: '评测作答回顾',
+            right: '答对',
+            wrong: '答错',
+            noScore: '未评分',
+            ansRes: '作答结果',
+            testAns: '参考答案',
+            testAnalyse: '解析',
+            repairSource: '补救资源',
+            noAns: '未作答',
+            linkSource: '网络资源',
+            noSource: '暂无资源',
+            fileSource: '文件资源',
+            fileView: '文件预览',
+            noReview: '该文件暂不支持预览,请下载查看!',
+            pdfErr: 'pdf 加载失败',
+            noAnalyse: '暂无解析'
         },
         },
-        "timeoutHint": "评量活动时间已结束,逾时将以0分计算,或等待教师开放补考。",
-        "contentPage": "评量内容",
-        "scorePage": "成绩报告",
-        "practiceHint": "评量活动时间已结束,仍可点击试卷连结,持续练习。",
-        "performance": "成绩表现",
-        "reviewAnswers": "答题状况回顾",
-        "Chinese": "国文",
-        "Math": "数学",
-        "English": "英文",
-        "score": "得分",
-        "difficulty": "考题综合难易度", 
-        "average": "班平均分数",
-        "rightNum": "我的答对题数",
-        "smartComment": "智能点评",
-        "keypoint": "建议复习知识点:",
-        "chart": {
-            "scoreDistribution": "评量成绩分布图",
-            "participant": "应考人数:",
-            "student": "人",
-            "keyPointPerformance": "知识点表现雷达图",
-            "me": "个人",
-            "participantAverage": "全校",
-            "recognizePerformance": "认知层次雷达图"
+        timeoutHint: '评量活动时间已结束,逾时将以0分计算,或等待教师开放补考。',
+        contentPage: '评量内容',
+        scorePage: '成绩报告',
+        practiceHint: '评量活动时间已结束,仍可点击试卷连结,持续练习。',
+        performance: '成绩表现',
+        reviewAnswers: '答题状况回顾',
+        Chinese: '国文',
+        Math: '数学',
+        English: '英文',
+        score: '得分',
+        difficulty: '考题综合难易度',
+        average: '班平均分数',
+        rightNum: '我的答对题数',
+        smartComment: '智能点评',
+        keypoint: '建议复习知识点:',
+        chart: {
+            scoreDistribution: '评量成绩分布图',
+            participant: '应考人数:',
+            student: '人',
+            keyPointPerformance: '知识点表现雷达图',
+            me: '个人',
+            participantAverage: '全校',
+            recognizePerformance: '认知层次雷达图'
         },
         },
-        "studentScore": {
-            "examName": "考试名称",
-            "examType":"考试类型",
-            "stableIndex":"学习稳定系数",
-            "name":"姓名",
-            "stuNo":"学号",
-            "class": "班级",
-            "allSubScore": "全学科成绩",
-            "total":"个人总分",
-            "cAverages":"班级平均分",
-            "gAverages":"年级平均分",
-            "aAverages":"区级平均分",
-            "cIndex":"班级排名",
-            "gIndex":"年级排名",
-            "aIndex":"区级排名",
-            "onLine": "是否进线",
-            "subject":"学科",
-            "score": "个人得分",
-            "cAverage": "班级平均",
-            "gAverage": "年级平均",
-            "aAverage": "区级平均",
-            "rAns":"答对题数",
-            "wAns":"答错题数",
-            "comIndex":"综合难度",
-            "objItem":"客观",
-            "subItem":"主观",
-            "subjects":"科目",
-            "item":"题目",
-            "objItems": "客观题",
-            "subItems": "主观题",
-            "itemIndex":"题号",
-            "standardIndex":"标准答案/配分",
-            "stuAnsIndex":"学生作答/得分",
-            "notice": "【-】--答对,【#】--未作答,【?】--多选题",
-            "gradeErr":"成绩信息错误!"
+        studentScore: {
+            examName: '考试名称',
+            examType: '考试类型',
+            stableIndex: '学习稳定系数',
+            name: '姓名',
+            stuNo: '学号',
+            class: '班级',
+            allSubScore: '全学科成绩',
+            total: '个人总分',
+            cAverages: '班级平均分',
+            gAverages: '年级平均分',
+            aAverages: '区级平均分',
+            cIndex: '班级排名',
+            gIndex: '年级排名',
+            aIndex: '区级排名',
+            onLine: '是否进线',
+            subject: '学科',
+            score: '个人得分',
+            cAverage: '班级平均',
+            gAverage: '年级平均',
+            aAverage: '区级平均',
+            rAns: '答对题数',
+            wAns: '答错题数',
+            comIndex: '综合难度',
+            objItem: '客观',
+            subItem: '主观',
+            subjects: '科目',
+            item: '题目',
+            objItems: '客观题',
+            subItems: '主观题',
+            itemIndex: '题号',
+            standardIndex: '标准答案/配分',
+            stuAnsIndex: '学生作答/得分',
+            notice: '【-】--答对,【#】--未作答,【?】--多选题',
+            gradeErr: '成绩信息错误!'
         },
         },
-        "correctAnswer": "答对",
-        "wrongAnswer": "答错",
-        "unAnswered": "未答",
-        "solution": "解答",
-        "analysis": "解析",
-        "correctRate": "答对率",
-        "relatedAQues": "关联题目",
+        'correctAnswer': '答对',
+        wrongAnswer: '答错',
+        unAnswered: '未答',
+        solution: '解答',
+        analysis: '解析',
+        correctRate: '答对率',
+        relatedAQues: '关联题目',
+        answer: '作答',
+        inputAnswers: '请输入作答结果',
+        emput: '空',
+
     },
     },
-    "informview-title": "通知总览",
-    "view": "前往检视",
-    "read": "已读",
-    "studyview-title": "自主学习",
-    "hiteachview-title": "HiTeach课堂记录",
-    "hiteachNote": {
-        "material": "上课内容",
-        "classInteractionRecord": "课堂互动记录",
-        "qA": "即问即答",
-        "qAMulti": "即问即答(多选)",
-        "reference": "参考答案",
-        "correct": "答案正确",
-        "groupQAMulti": "分组即问即答(多选)",
-        "poImg": "教师从Hiteach推送了一张图:",
-        "link": "分享连结"
+    queNaire: {
+        submitSuccess: '提交成功',
+        overTime: '不在作答时间范围内!',
+        answerErr: '作答数据错误!',
+        fileErr: '问价获取失败!'
     },
     },
-    "courseList-title": "我的课程清单",
-    "defaultClass": "表定课程",
-    "tempClass": "临时课程",
-    "courseContent": {
-        "baseInfo": "基本资讯",
-        "description": "课程概述",
-        "classmates": "同学名单",
-        "classID": "课程代码",
-        "classTime": "上课时间",
-        "classroom": "上课教室",
-        "teacher": "授课教师",
-        "co-teacher": "协同教师",
-        "addedTime": "加入课程日期",
-        "syllabus": "课纲概览",
-        "seatNo": "座号",
-        "name": "姓名",
-        "group": "组别"
+    'informview-title': '通知总览',
+    view: '前往检视',
+    read: '已读',
+    'studyview-title': '自主学习',
+    'hiteachview-title': 'HiTeach课堂记录',
+    hiteachNote: {
+        material: '上课内容',
+        classInteractionRecord: '课堂互动记录',
+        qA: '即问即答',
+        qAMulti: '即问即答(多选)',
+        reference: '参考答案',
+        correct: '答案正确',
+        groupQAMulti: '分组即问即答(多选)',
+        poImg: '教师从Hiteach推送了一张图:',
+        link: '分享连结'
     },
     },
-    "calendar-title": "行事历 - 109学年度第二学期",
-    "today": "今天",
-    "importEvent": "校园班级要事",
-    "deadlineTasks": "截止活动任务",
-    "schedule": "表定课表",
-    "des": "描述",
-    "time": "时间",
-    "place": "地点",
-    "course": "课程",
-    "mockcourses": ["阅读与写作", "英文简报", "电子电路专题实验", "计算机概论", "微处理机实验"],
-    "importEventTitle": "校园班级要事",
-    "Thatday": "当日",
-    "deadlineTasksTitle": "当日截止未完成活动任务"
-}  
+    'courseList-title': '我的课程清单',
+    defaultClass: '表定课程',
+    tempClass: '临时课程',
+    courseContent: {
+        baseInfo: '基本资讯',
+        description: '课程概述',
+        classmates: '同学名单',
+        classID: '课程代码',
+        classTime: '上课时间',
+        classroom: '上课教室',
+        teacher: '授课教师',
+        'co-teacher': '协同教师',
+        addedTime: '加入课程日期',
+        syllabus: '课纲概览',
+        seatNo: '座号',
+        name: '姓名',
+        group: '组别'
+    },
+    'calendar-title': '行事历 - 109学年度第二学期',
+    today: '今天',
+    importEvent: '校园班级要事',
+    deadlineTasks: '截止活动任务',
+    schedule: '表定课表',
+    des: '描述',
+    time: '时间',
+    place: '地点',
+    course: '课程',
+    mockcourses: ['阅读与写作', '英文简报', '电子电路专题实验', '计算机概论', '微处理机实验'],
+    importEventTitle: '校园班级要事',
+    Thatday: '当日',
+    deadlineTasksTitle: '当日截止未完成活动任务'
+}

+ 8 - 7
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/totalAnalysis.js

@@ -80,7 +80,7 @@ export default {
 	goExamList:'查看更多评测',
 	goExamList:'查看更多评测',
 
 
     // AchievementAnalysis.vue
     // AchievementAnalysis.vue
-    ach_title1: '及格率统计',
+    ach_title1: '得分率统计',
     ach_title2: '均分分析',
     ach_title2: '均分分析',
     ach_title3: '进线人数统计',
     ach_title3: '进线人数统计',
     ach_title4: '进线情况统计',
     ach_title4: '进线情况统计',
@@ -94,7 +94,7 @@ export default {
     ach_text4: '班级平均分',
     ach_text4: '班级平均分',
     ach_text5: '校级平均分',
     ach_text5: '校级平均分',
     ach_text6: '区级平均分',
     ach_text6: '区级平均分',
-    ach_text7: '班级总人数',
+    ach_text7: '总人数',
     ach_text8: '进线总人数',
     ach_text8: '进线总人数',
     ach_text9: '进线率',
     ach_text9: '进线率',
     ach_text10: '当前班级',
     ach_text10: '当前班级',
@@ -136,7 +136,7 @@ export default {
     sca_text8: '偶尔粗心,准备不够充分',
     sca_text8: '偶尔粗心,准备不够充分',
     sca_text9: '学习不够充分,需要更加努力',
     sca_text9: '学习不够充分,需要更加努力',
     sca_text10: '学习极不稳定, 对考试没有充分准备',
     sca_text10: '学习极不稳定, 对考试没有充分准备',
-    sca_chart_text1: '通过率',
+    sca_chart_text1: '得分率',
     sca_chart_text2: '稳定度',
     sca_chart_text2: '稳定度',
     sca_table_text1: '答对题数',
     sca_table_text1: '答对题数',
     sca_table_text2: '答错题数',
     sca_table_text2: '答错题数',
@@ -216,9 +216,9 @@ export default {
     ka_table_text6: '得分率',
     ka_table_text6: '得分率',
     ka_table_text7: '涉及题号',
     ka_table_text7: '涉及题号',
     ka_table_text8: '平均得分率',
     ka_table_text8: '平均得分率',
-    ka_table_text9: '错题人',
-    ka_table_text10: 'RH错题人',
-    ka_table_text11: 'RL错题人',
+    ka_table_text9: '错题人',
+    ka_table_text10: 'RH错题人',
+    ka_table_text11: 'RL错题人',
 
 
     ka_tip1: '* RH:高分区段 / RL:低分区段',
     ka_tip1: '* RH:高分区段 / RL:低分区段',
 
 
@@ -260,7 +260,8 @@ export default {
 		option:'选项',
 		option:'选项',
 		answerRate:'选答率',
 		answerRate:'选答率',
 		RHRate:'高分组选答率',
 		RHRate:'高分组选答率',
-		RLRate:'低分组选答率'
+		RLRate:'低分组选答率',
+		tip:'* 绿色代表进线,蓝色代表踩线'
 	}
 	}
 
 
 }
 }

+ 3 - 1
TEAMModelOS/ClientApp/src/locale/lang/zh-CN/utils.js

@@ -1,5 +1,7 @@
 export default {
 export default {
     uploadVideoLimit:'最多只能上传一个视频!',
     uploadVideoLimit:'最多只能上传一个视频!',
 	videoFormatError:'视频格式不正确!请重新选择!',
 	videoFormatError:'视频格式不正确!请重新选择!',
-	audioFormatError:'音频格式不正确!请重新选择!'
+	audioFormatError:'音频格式不正确!请重新选择!',
+	fileReadFail:'有试题数据读取失败!',
+	uploadLoading:'上传中...'
 }
 }

+ 19 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/cusMgt.js

@@ -204,4 +204,23 @@ export default {
     nameTips: '請輸入節點名稱',
     nameTips: '請輸入節點名稱',
     typeTips: '請設定節點類型',
     typeTips: '請設定節點類型',
     startTips: '請設定時間',
     startTips: '請設定時間',
+
+    //CoursePlan.vue
+    cusTable: '課程表',
+    importLabel: '導入課表',
+    cusMode: '課程模式',
+
+    //ClassTable.vue
+    noAddTea: '當前課程未添加授課老師',
+    sltCusTips: '請先選擇課程',
+    setCusWarning: '請設定課程',
+    setTeaWarning: '請設定教師',
+    mon: '星期一',
+    tue: '星期二',
+    wed: '星期三',
+    thu: '星期四',
+    fri: '星期五',
+    sat: '星期六',
+    sun: '星期日',
+    
 }
 }

+ 2 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/index.js

@@ -30,6 +30,7 @@ import survey from './survey'
 import updModal from './updModal'
 import updModal from './updModal'
 import http from './http'
 import http from './http'
 import utils from './utils'
 import utils from './utils'
+import knowledge from './knowledge'
 export default {
 export default {
   
   
   schoolBaseInfo,
   schoolBaseInfo,
@@ -64,6 +65,7 @@ export default {
   updModal,
   updModal,
   http,
   http,
   utils,
   utils,
+  knowledge,
   test: '測試',
   test: '測試',
   formConfigP: {
   formConfigP: {
     input: '請輸入',
     input: '請輸入',

+ 58 - 0
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/knowledge.js

@@ -0,0 +1,58 @@
+export default {
+    subject: '科目',
+    label: '名稱',
+    blockP: '請輸入知識塊名稱',
+    confirm: '確認',
+    blockWarning: '知識塊名稱不能為空!',
+    block: '知識塊',
+    knowledgeP: '請輸入知識點名稱,必填項',
+    knowledgeWarning: '知識點名稱不能為空! ',
+    newBlock: '新增知識塊',
+    addBlock: '添加知識塊',
+    inputBlock: '輸入知識塊名稱',
+    nowBlock: '現有知識塊',
+    nowBlockN: '選擇知識塊 ( *若所選知識塊內已存在添加的知識點則會覆蓋 )',
+    selectPoint: '已選知識點',
+    blockWarning2: '已存在同名知識塊,請修改名稱! ',
+    blockWarning3: '知識塊名稱不能為空',
+    blockWarning4: '無現有知識塊選擇',
+    period: '當前學段',
+    searchSubject: '搜索學科...',
+    blockCount: '知識塊數',
+    point: '知識點',
+    searchPoint: '搜索知識點...',
+    makeBlock: '組成知識塊',
+    edit: '編輯',
+    delete: '刪除',
+    moveBlock: '移出知識塊',
+    searchBlock: '搜索知識塊',
+    buildBlock: '新建知識塊',
+    pointCount: '知識點數:',
+    editBlock: '編輯知識塊',
+    addPoint: '新增知識點',
+    editPoint: '編輯知識點',
+    cancel: '取消',
+    notice: '提示',
+    content0: '確定將',
+    content2: '等',
+    content3: '個知識點移入到知識塊',
+    content1: '中(*已存在的知識點會自動忽略)',
+    notice1: '所選知識點已存在該知識塊中',
+    notice2: '該知識塊已存在當前知識點',
+    content4: '確定將知識點',
+    content5: '移入到知識塊',
+    content6: '中? ',
+    success: '操作成功! ',
+    fail: '操作失敗! ',
+    warn: '知識塊數據獲取失敗',
+    delBlock: '確認刪除該知識塊?',
+    delSuccess: '刪除成功',
+    delFail: '刪除失敗',
+    delPoint: '確認刪除該知識點?',
+    content7: '確定將知識點',
+    content8: '從知識塊',
+    content9: '中移出',
+    moveFail: '移出失敗',
+    saveSuccess: '保存數據成功! ',
+    saveFail: '保存數據失敗! '
+}

+ 440 - 419
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/studentWeb.js

@@ -1,420 +1,441 @@
 export default {
 export default {
-	"home": {
-		"teacher": "教師",
-		"student": "學生",
-		"setting": "個人設定",
-		"logout": "登出",
-		"joinClass": "加入課程",
-		"exam": "評量",
-		"vote": "投票",
-		"survey": "問卷",
-	},
-	"public": {
-		"going": "進行中",
-		"finish": "已結束",
-		"schoolExam": "校級評測",
-		"privateExam": "個人評測",
-		"schoolVote": "校級投票",
-		"privateVote": "個人投票",
-		"schoolSurvey": "校級問卷",
-		"privateSurvey": "個人問卷",
-		"search": "請輸入查詢內容..."
-	},
-	"event": {
-		"allStatus": "所有活動狀態",
-		"unFinished": "未完成",
-		"Fineshed": "已完成",
-		"Timeout": "已逾時",
-		"makeupExam": "可補考",
-		"makeupHw": "可補交",
-		"selectActivity": "請從列表挑選一個活動",
-		"allSubject": "綜合科目"
-	},
-	"settingView-title": "個人設定",
-	"teammodel-account-management": {
-		"page-title": "TeamModel 帳號管理",
-		"name": "姓名",
-		"account": "帳號",
-		"password": "密碼",
-		"phone": "手機號碼",
-		"e-mail": "E-mail",
-		"binding": "綁定管理",
-		"isbind": "綁定",
-		"unbind": "解除綁定",
-		"save": "儲存設定"
-	},
-	"preference": {
-		"page-title": "偏好設定",
-		"UI-theme": "介面樣式設定",
-		"language": "語系設定"
-	},
-	"change-school": {
-		"page-title": "切換學校",
-		"current-data-school": "目前資料來源學校",
-		"Habook-smart-school": "Habook智慧校園"
-	},
-	"homeView-title": "首頁資訊總覽",
-	"calenderCardTitle": "行事歷",
-	"recentClass": "近期上課提醒",
-	"defaultRecentClass": "微處理機基礎與應用概論",
-	"defaultClassTime": "星期三 13:30 - 16:30 (第7-9節)",
-	"defaultClassPlace": "第五教學樓 F504 教室",
-	"todaydeadlineList": "今日截止活動提醒 ",
-	"endsTodayTime": "今日23:59截止",
-	"coursesCardTitle": "我的課程清單",
-	"newAddCourse": "最新加入:選修數學(二)",
-	"missionListCardTitle": "活動任務清單",
-	"missionListCardLoading": "載入中",
-	"missionListCardReachBottom": "已經最底,沒活動啦!",
-	"myProgressBar": {
-		"tasksCompletionRate": "活動任務完成率",
-		"selfStudyClickRate": "自學教材點閱率"
-	},
-	"chartNames": [
-		"平均自學時間",
-		"本學期每月自學時數曲線",
-		"上月我與年級的活動參與數比較",
-		"每日平均自學時間與全年級比較圖",
-		"本月各類活動任務參與時間佔比",
-		"自學活躍度"
-	],
-	"studyTimeChart": {
-		"averageTime": "分/日",
-		"xAxisData": [
-			"日",
-			"一",
-			"二",
-			"三",
-			"四",
-			"五",
-			"六"
-		]
-	},
-	"splineSreaChart": {
-		"xAxisData": [
-			"2月",
-			"3月",
-			"4月",
-			"5月",
-			"6月"
-		]
-	},
-	"stackBarChart": {
-		"chartMon": "5月",
-		"yAxisData": [
-			"我(三年級)",
-			"三年級",
-			"二年級",
-			"ㄧ年級"
-		],
-		"stackType": [
-			"作業",
-			"評量",
-			"課前預習",
-			"投票"
-		]
-	},
-	"twoLineChart": {
-		"xAxisData": [
-			"日",
-			"ㄧ",
-			"二",
-			"三",
-			"四",
-			"五",
-			"六"
-		]
-	},
-	"eventPieChart": {
-		"partType": [
-			"作業",
-			"評量",
-			"課前預習",
-			"投票"
-		]
-	},
-	"studyHeatMap": {
-		"xAxisData": [
-			"ㄧ",
-			"二",
-			"三",
-			"四",
-			"五"
-		]
-	},
-	"latestNotification": "最新通知",
-	"postAt": "發佈於",
-	"______________": "______________",
-	"eventView-title": "活動任務",
-	"nextTask": "下個活動",
-	"allStatus": "所有活動狀態",
-	"unFinished": "未完成",
-	"Fineshed": "已完成",
-	"Timeout": "已逾時",
-	"makeupExam": "可補考",
-	"makeupHW": "可補交",
-	"empty": "目前無資料 ~",
-	"baseInfo": {
-		"subject": "科目:",
-		"teacher": "教師:",
-		"period": "活動期限:",
-		"postTime": "發佈時間:",
-		"classTime": "上課時間",
-		"unFinished": "未完成",
-		"Fineshed": "已完成",
-		"Closed": "已結束"
-	},
-	"billboard": {
-		"description": "描述",
-		"referlink": "連結資料",
-		"attachment": "附件",
-		"reference": "參考資料"
-	},
-	"preview": {
-		"checkpoint": "活動任務",
-		"tutorial": "編序教材",
-		"multiQues": "多題闖關模組",
-		"previewContent": {
-			"tutorial": "教材",
-			"Des": "內容",
-			"Unit": "單元",
-			"quiz": "隨堂考"
-		},
-		"previous": "上一題",
-		"next": "下一題",
-		"sentAns": "送出答案",
-		"tryAgain": "詳讀教材,再試一次",
-		"nextUnit": "下一單元",
-		"goHome": "回到首頁",
-		"quizRetries": "測驗重試次數",
-		"crossUnitHint": "上個單元測驗尚未完成,請先完成方可進行本單元測驗",
-		"timeoutHint": "課前預習活動時間已結束,仍可進行教材閱讀與練習,如於結束時間前未完成,相關成績可能受到影響。"
-	},
-	"vote": {
-		"bollotbox": "投票區",
-		"submit": "確定送出",
-		"reVote": "再次投票",
-		"voteSuccess": "投票成功",
-		"voteDes": "活動結束後,即可檢視大家的投票結果",
-		"timeoutHint": "投票時間已過,無法再進行投票,敬請留意教師發布投票結果!",
-		"voteResult": "本次投票結果為:",
-		"voteDesDefault": "請選擇一個想要的方案:",
-		"tickets": "票",
-		"surplusTickets": "剩餘票數",
-		"submitBVote": "提交投票",
-		"note": "請至少選擇一個選項,再進行投票!",
-		"warning": "投票失敗,請檢查投票信息!",
-		"warning2": "已超出最大投票數!",
-		"voteRes": "投票結果",
-		"voteRecord": "投票記錄"
-	},
-	"homework": {
-		"homeworkUpload": "作業上傳區",
-		"homeworkUoloadBtn": "上傳作業",
-		"homeworkReUoloadBtn": "重新上傳",
-		"CommentClassmatesHomeworkBtn": "同學作業觀摩互評",
-		"uploadSuccess": "上傳成功",
-		"uploadDes": "活動結束後,即可檢視作業成績評語",
-		"timeoutHint": "作業上傳時間已結束,本次作業成績將以 0分 計算,或等候教師開放補交。",
-		"contentPage": "作業內容",
-		"scorePage": "成績評語",
-		"score": "教師評分",
-		"classmatesComments": "同學給評",
-		"comment": "給評: "
-	},
-	"classmatesComment": {
-		"title": "同學作業觀摩與互評",
-		"seatNo": "座號",
-		"name": "姓名",
-		"star": "星級",
-		"comment": "給評",
-		"preview": "作業預覽:檔案名稱",
-		"unPreview": "這個檔案的格式目前不提供預覽",
-		"download": "下載檔案",
-		"submitted": "提交",
-		"inputSomething": "輸入評語與其他建議",
-		"previous": "上一位",
-		"next": "下一位",
-		"submitBtn": "送出"
-	},
-	"exam": {
-		"examLink": "試卷鏈接",
-		"isSubject": "科試卷",
-		"subjectNow": "當前科目",
-		"examData": "評測內容",
-		"gradeReport": "成績報告",
-		"gradeAnalyse": "成績分析",
-		"testpop": {
-			"title": "評量",
-			"completion": "完成度",
-			"practiceMode": "練習模式",
-			"all": "練習全部",
-			"onlywrong": "只練習答錯",
-			"questions": "的題目",
-			"submitted": "交卷",
-			"finish": "已完成",
-			"showAns": "顯示答案",
-			"hideAns": "隱藏答案",
-			"hint": "重點提示",
-			"previous": "上一題",
-			"next": "下一題",
-			"myAnswerSheet": "我的答題卡",
-			"exitQuizhint": "離開測驗提示",
-			"exitQuizhintDe": "系統檢測您尚未「交卷」,如您選擇「確定」,",
-			"exitQuizhintDes": "則目前作答將不保存,下次需重新測驗",
-			"cancel": "取消",
-			"ok": "確定",
-			"submitQuizhint": "交卷提示",
-			"submitQuizhintDes1": "系統檢測目前您已全數作答完成,確定交卷嗎?",
-			"check": "否,需再檢查",
-			"conAnswer0": "目前您有",
-			"conAnswer1": "題 未作答 (詳查答案卡)",
-			"conAnswer2": ",請先完成題目作答!",
-			"conAnswer": "繼續作答",
-			"okSubmit": "確定交卷",
-			"qNo": "題號:",
-			"myAns": "作答",
-			"correction": "正解",
-			"queNo": "題目:",
-			"myAns": "我的作答:"
-		},
-		"report": {
-			"anwser": "前往作答",
-			"noRes": "成績尚未結算",
-			"getScore": "得分題目數",
-			"answerBack": "評測作答回顧",
-			"right": "答對",
-			"wrong": "答錯",
-			"noScore": "未評分",
-			"ansRes": "作答結果",
-			"testAns": "參考答案",
-			"testAnalyse": "解析",
-			"repairSource": "補救資源",
-			"noAns": "未作答",
-			"linkSource": "網絡資源",
-			"noSource": "暫無資源",
-			"fileSource": "文件資源",
-			"fileView": "文件預覽",
-			"noReview": "該文件暫不支持預覽,請下載查看!",
-			"pdfErr": "'pdf 加載失敗'",
-			"noAnalyse": "暫無解析"
-		},
-		"timeoutHint": "評量活動時間已結束,逾時將以0分計算,或等待教師開放補考。",
-		"contentPage": "評量內容",
-		"scorePage": "成績報告",
-		"practiceHint": "評量活動時間已結束,仍可點擊試卷連結,持續練習。",
-		"performance": "成績表現",
-		"reviewAnswers": "答題狀況回顧",
-		"Chinese": "國文",
-		"Math": "數學",
-		"English": "英文",
-		"score": "得分",
-		"difficulty": "考題綜合難易度",
-		"average": "班平均分數",
-		"rightNum": "我的答對題數",
-		"smartComment": "智能點評",
-		"keypoint": "建議複習知識點:",
-
-
-		"chart": {
-			"scoreDistribution": "評量成績分佈圖",
-			"participant": "應考人數:",
-			"student": "人",
-			"keyPointPerformance": "知識點表現雷達圖",
-			"me": "個人",
-			"participantAverage": "全校",
-			"recognizePerformance": "認知層次雷達圖"
-		},
-		"studentScore": {
-			"examName": "考試名稱",
-			"examType": "考試類型",
-			"stableIndex": "學習穩定係數",
-			"name": "姓名",
-			"stuNo": "學號",
-			"class": "班級",
-			"allSubScore": "全學科成績",
-			"total": "個人總分",
-			"cAverages": "班級平均分",
-			"gAverages": "年級平均分",
-			"aAverages": "區級平均分",
-			"cIndex": "班級排名",
-			"gIndex": "年級排名",
-			"aIndex": "區級排名",
-			"onLine": "是否進線",
-			"subject": "學科",
-			"score": "個人得分",
-			"cAverage": "班級平均",
-			"gAverage": "年級平均",
-			"aAverage": "區級平均",
-			"rAns": "答對題數",
-			"wAns": "答錯題數",
-			"comIndex": "綜合難度",
-			"objItem": "客觀",
-			"subItem": "主觀",
-			"subjects": "科目",
-			"item": "題目",
-			"objItems": "客觀題",
-			"subItems": "主觀題",
-			"itemIndex": "題號",
-			"standardIndex": "標準答案/配分",
-			"stuAnsIndex": "學生作答/得分",
-			"notice": "【-】--答對,【#】--未作答,【?】--多選題",
-			"gradeErr": "成績信息錯誤!"
-		},
-		"correctAnswer": "答對",
-		"wrongAnswer": "答錯",
-		"unAnswered": "未答",
-		"solution": "解答",
-		"analysis": "解析",
-		"correctRate": "答對率",
-		"relatedAQues": "關聯題目",
-
-	},
-	"informview-title": "通知總覽",
-	"view": "前往檢視",
-	"read": "已讀",
-	"studyview-title": "自主學習",
-	"hiteachview-title": "HiTeach課堂記錄",
-	"hiteachNote": {
-		"material": "上課內容",
-		"classInteractionRecord": "課堂互動記錄",
-		"qA": "即問即答",
-		"qAMulti": "即問即答(多選)",
-		"reference": "參考答案",
-		"correct": "答案正確",
-		"groupQAMulti": "分組即問即答(多選)",
-		"poImg": "教師從Hiteach推送了一張圖:",
-		"link": "分享連結"
-	},
-	"courseList-title": "我的課程清單",
-	"defaultClass": "表定課程",
-	"tempClass": "臨時課程",
-	"courseContent": {
-		"baseInfo": "基本資訊",
-		"description": "課程概述",
-		"classmates": "同學名單",
-		"classID": "課程代碼",
-		"classTime": "上課時間",
-		"classroom": "上課教室",
-		"teacher": "授課教師",
-		"co-teacher": "協同教師",
-		"addedTime": "加入課程日期",
-		"syllabus": "課綱概覽",
-		"seatNo": "座號",
-		"name": "姓名",
-		"group": "組別"
-	},
-	"calendar-title": "行事歷 - 109學年度第二學期",
-	"today": "今天",
-	"importEvent": "校園班級要事",
-	"deadlineTasks": "截止活動任務",
-	"schedule": "表定課表",
-	"des": "描述",
-	"time": "時間",
-	"place": "地點",
-	"course": "課程",
-	"mockcourses": ["閱讀與寫作", "英文簡報", "電子電路專題實驗", "計算機概論", "微處理機實驗"],
-	"importEventTitle": "校園班級要事",
-	"Thatday": "當日",
-	"deadlineTasksTitle": "當日截止未完成活動任務"
-}
+    home: {
+        teacher: '教師',
+        student: '學生',
+        setting: '個人設定',
+        logout: '登出',
+        joinClass: '加入課程',
+        exam: '評量',
+        vote: '投票',
+        survey: '問卷'
+    },
+    public: {
+        noData: '暫無數據',
+        going: '進行中',
+        finish: '已結束',
+        schoolExam: '校級評測',
+        privateExam: '個人評測',
+        schoolVote: '校級投票',
+        privateVote: '個人投票',
+        schoolSurvey: '校級問卷',
+        privateSurvey: '個人問卷',
+        search: '請輸入查詢內容...',
+        noitice: '此功能暫未開放!'
+    },
+    event: {
+        allStatus: '所有活動狀態',
+        unFinished: '未完成',
+        Fineshed: '已完成',
+        Timeout: '已逾時',
+        makeupExam: '可補考',
+        makeupHw: '可補交',
+        selectActivity: '請從列表挑選一個活動',
+        allSubject: '綜合科目'
+    },
+    'settingView-title': '個人設定',
+    'teammodel-account-management': {
+        'page-title': 'TeamModel 帳號管理',
+        name: '姓名',
+        account: '帳號',
+        password: '密碼',
+        phone: '手機號碼',
+        'e-mail': 'E-mail',
+        binding: '綁定管理',
+        isbind: '綁定',
+        unbind: '解除綁定',
+        save: '儲存設定'
+    },
+    preference: {
+        'page-title': '偏好設定',
+        'UI-theme': '介面樣式設定',
+        language: '語系設定'
+    },
+    'change-school': {
+        'page-title': '切換學校',
+        'current-data-school': '目前資料來源學校',
+        'Habook-smart-school': 'Habook智慧校園'
+    },
+    'homeView-title': '首頁資訊總覽',
+    calenderCardTitle: '行事歷',
+    recentClass: '近期上課提醒',
+    defaultRecentClass: '微處理機基礎與應用概論',
+    defaultClassTime: '星期三 13:30 - 16:30 (第7-9節)',
+    defaultClassPlace: '第五教學樓 F504 教室',
+    todaydeadlineList: '今日截止活動提醒 ',
+    endsTodayTime: '今日23:59截止',
+    coursesCardTitle: '我的課程清單',
+    newAddCourse: '最新加入:選修數學(二)',
+    missionListCardTitle: '活動任務清單',
+    missionListCardLoading: '載入中',
+    missionListCardReachBottom: '已經最底,沒活動啦! ',
+    myProgressBar: {
+        tasksCompletionRate: '活動任務完成率',
+        selfStudyClickRate: '自學教材點閱率'
+    },
+    chartNames: [
+        '平均自學時間',
+        '本學期每月自學時數曲線',
+        '上月我與年級的活動參與數比較',
+        '每日平均自學時間與全年級比較圖',
+        '本月各類活動任務參與時間佔比',
+        '自學活躍度'
+    ],
+    studyTimeChart: {
+        averageTime: '分/日',
+        xAxisData: [
+            '日',
+            '一',
+            '二',
+            '三',
+            '四',
+            '五',
+            '六'
+        ]
+    },
+    splineSreaChart: {
+        xAxisData: [
+            '2月',
+            '3月',
+            '4月',
+            '5月',
+            '6月'
+        ]
+    },
+    stackBarChart: {
+        chartMon: '5月',
+        yAxisData: [
+            '我(三年級)',
+            '三年級',
+            '二年級',
+            'ㄧ年級'
+        ],
+        stackType: [
+            '作業',
+            '評量',
+            '課前預習',
+            '投票'
+        ]
+    },
+    twoLineChart: {
+        xAxisData: [
+            '日',
+            'ㄧ',
+            '二',
+            '三',
+            '四',
+            '五',
+            '六'
+        ]
+    },
+    eventPieChart: {
+        partType: [
+            '作業',
+            '評量',
+            '課前預習',
+            '投票'
+        ]
+    },
+    studyHeatMap: {
+        xAxisData: [
+            'ㄧ',
+            '二',
+            '三',
+            '四',
+            '五'
+        ]
+    },
+    latestNotification: '最新通知',
+    postAt: '發佈於',
+    '______________': '______________',
+    'eventView-title': '活動任務',
+    nextTask: '下個活動',
+    allStatus: '所有活動狀態',
+    unFinished: '未完成',
+    Fineshed: '已完成',
+    Timeout: '已逾時',
+    makeupExam: '可補考',
+    makeupHW: '可補交',
+    empty: '目前無資料 ~',
+    baseInfo: {
+        subject: '科目:',
+        teacher: '教師:',
+        period: '活動期限:',
+        postTime: '發佈時間:',
+        classTime: '上課時間',
+        unFinished: '未完成',
+        Fineshed: '已完成',
+        Closed: '已結束'
+    },
+    billboard: {
+        description: '描述',
+        referlink: '連結資料',
+        attachment: '附件',
+        reference: '參考資料'
+    },
+    preview: {
+        checkpoint: '活動任務',
+        tutorial: '編序教材',
+        multiQues: '多題闖關模組',
+        previewContent: {
+            tutorial: '教材',
+            Des: '內容',
+            Unit: '單元',
+            quiz: '隨堂考'
+        },
+        previous: '上一題',
+        next: '下一題',
+        sentAns: '送出答案',
+        tryAgain: '詳讀教材,再試一次',
+        nextUnit: '下一單元',
+        goHome: '回到首頁',
+        quizRetries: '測驗重試次數',
+        crossUnitHint: '上個單元測驗尚未完成,請先完成方可進行本單元測驗',
+        timeoutHint: '課前預習活動時間已結束,仍可進行教材閱讀與練習,如於結束時間前未完成,相關成績可能受到影響。 '
+    },
+    vote: {
+        bollotbox: '投票區',
+        submit: '確定送出',
+        reVote: '再次投票',
+        voteSuccess: '投票成功',
+        voteDes: '活動結束後,即可檢視大家的投票結果',
+        timeoutHint: '投票時間已過,無法再進行投票,敬請留意教師發布投票結果! ',
+        voteResult: '本次投票結果為:',
+        voteDesDefault: '請選擇一個想要的方案:',
+        tickets: '票',
+        surplusTickets: '剩餘票數',
+        submitBVote: '提交投票',
+        note: '請至少選擇一個選項,再進行投票! ',
+        warning: '投票失敗,請檢查投票信息! ',
+        warning2: '已超出最大投票數! ',
+        voteRes: '投票結果',
+        voteRecord: '投票記錄',
+        voteTime: '投票時間'
+    },
+    homework: {
+        homeworkUpload: '作業上傳區',
+        homeworkUoloadBtn: '上傳作業',
+        homeworkReUoloadBtn: '重新上傳',
+        CommentClassmatesHomeworkBtn: '同學作業觀摩互評',
+        uploadSuccess: '上傳成功',
+        uploadDes: '活動結束後,即可檢視作業成績評語',
+        timeoutHint: '作業上傳時間已結束,本次作業成績將以 0分 計算,或等候教師開放補交。 ',
+        contentPage: '作業內容',
+        scorePage: '成績評語',
+        score: '教師評分',
+        classmatesComments: '同學給評',
+        comment: '給評: '
+    },
+    classmatesComment: {
+        title: '同學作業觀摩與互評',
+        seatNo: '座號',
+        name: '姓名',
+        star: '星級',
+        comment: '給評',
+        preview: '作業預覽:檔案名稱',
+        unPreview: '這個檔案的格式目前不提供預覽',
+        download: '下載檔案',
+        submitted: '提交',
+        inputSomething: '輸入評語與其他建議',
+        previous: '上一位',
+        next: '下一位',
+        submitBtn: '送出'
+    },
+    exam: {
+        examLink: '試卷鏈接',
+        isSubject: '科試卷',
+        subjectNow: '當前科目',
+        examData: '評測內容',
+        gradeReport: '成績報告',
+        gradeAnalyse: '成績分析',
+        queType: {
+            single: '單選題',
+            multiply: '多選題',
+            judge: '判斷題',
+            complete: '填空題',
+            subjective: '問答題',
+            compose: '綜合題',
+            correct: '改錯題',
+            connector: '連線題'
+        },
+        submitSuccess: '作答信息提交成功! ',
+        submitFail: '作答信息保存失敗! ',
+        msgWarning: '作答信息錯誤! ',
+        testpop: {
+            title: '評量',
+            completion: '完成度',
+            practiceMode: '練習模式',
+            all: '練習全部',
+            onlywrong: '只練習答錯',
+            questions: '的題目',
+            submitted: '交卷',
+            finish: '已完成',
+            showAns: '顯示答案',
+            hideAns: '隱藏答案',
+            hint: '重點提示',
+            previous: '上一題',
+            next: '下一題',
+            myAnswerSheet: '我的答題卡',
+            exitQuizhint: '離開測驗提示',
+            exitQuizhintDe: '系統檢測您尚未「交卷」,如您選擇「確定」,',
+            exitQuizhintDes: '則目前作答將不保存,下次需重新測驗',
+            cancel: '取消',
+            ok: '確定',
+            submitQuizhint: '交卷提示',
+            submitQuizhintDes1: '系統檢測目前您已全數作答完成,確定交卷嗎? ',
+            check: '否,需再檢查',
+            conAnswer0: '目前您有',
+            conAnswer1: '題 未作答 (詳查答案卡)',
+            conAnswer2: ',請先完成題目作答! ',
+            conAnswer: '繼續作答',
+            okSubmit: '確定交卷',
+            qNo: '題號:',
+            correction: '正解',
+            queNo: '題目:',
+            myAns: '我的作答:'
+        },
+        report: {
+            anwser: '前往作答',
+            noRes: '成績尚未結算',
+            getScore: '得分題目數',
+            answerBack: '評測作答回顧',
+            right: '答對',
+            wrong: '答錯',
+            noScore: '未評分',
+            ansRes: '作答結果',
+            testAns: '參考答案',
+            testAnalyse: '解析',
+            repairSource: '補救資源',
+            noAns: '未作答',
+            linkSource: '網絡資源',
+            noSource: '暫無資源',
+            fileSource: '文件資源',
+            fileView: '文件預覽',
+            noReview: '該文件暫不支持預覽,請下載查看! ',
+            pdfErr: 'pdf 加載失敗',
+            noAnalyse: '暫無解析'
+        },
+        timeoutHint: '評量活動時間已結束,逾時將以0分計算,或等待教師開放補考。 ',
+        contentPage: '評量內容',
+        scorePage: '成績報告',
+        practiceHint: '評量活動時間已結束,仍可點擊試卷連結,持續練習。 ',
+        performance: '成績表現',
+        reviewAnswers: '答題狀況回顧',
+        Chinese: '國文',
+        Math: '數學',
+        English: '英文',
+        score: '得分',
+        difficulty: '考題綜合難易度',
+        average: '班平均分數',
+        rightNum: '我的答對題數',
+        smartComment: '智能點評',
+        keypoint: '建議複習知識點:',
+        chart: {
+            scoreDistribution: '評量成績分佈圖',
+            participant: '應考人數:',
+            student: '人',
+            keyPointPerformance: '知識點表現雷達圖',
+            me: '個人',
+            participantAverage: '全校',
+            recognizePerformance: '認知層次雷達圖'
+        },
+        studentScore: {
+            examName: '考試名稱',
+            examType: '考試類型',
+            stableIndex: '學習穩定係數',
+            name: '姓名',
+            stuNo: '學號',
+            class: '班級',
+            allSubScore: '全學科成績',
+            total: '個人總分',
+            cAverages: '班級平均分',
+            gAverages: '年級平均分',
+            aAverages: '區級平均分',
+            cIndex: '班級排名',
+            gIndex: '年級排名',
+            aIndex: '區級排名',
+            onLine: '是否進線',
+            subject: '學科',
+            score: '個人得分',
+            cAverage: '班級平均',
+            gAverage: '年級平均',
+            aAverage: '區級平均',
+            rAns: '答對題數',
+            wAns: '答錯題數',
+            comIndex: '綜合難度',
+            objItem: '客觀',
+            subItem: '主觀',
+            subjects: '科目',
+            item: '題目',
+            objItems: '客觀題',
+            subItems: '主觀題',
+            itemIndex: '題號',
+            standardIndex: '標準答案/配分',
+            stuAnsIndex: '學生作答/得分',
+            notice: '【-】--答對,【#】--未作答,【?】--多選題',
+            gradeErr: '成績信息錯誤! '
+        },
+        'correctAnswer': '答對',
+        wrongAnswer: '答錯',
+        unAnswered: '未答',
+        solution: '解答',
+        analysis: '解析',
+        correctRate: '答對率',
+        relatedAQues: '關聯題目',
+        answer: '作答',
+        inputAnswers: '請輸入作答結果',
+        emput: '空'
+    },
+    queNaire: {
+        submitSuccess: '提交成功',
+        overTime: '不在作答時間範圍內! ',
+        answerErr: '作答數據錯誤! ',
+        fileErr: '問價獲取失敗! '
+    },
+    'informview-title': '通知總覽',
+    view: '前往檢視',
+    read: '已讀',
+    'studyview-title': '自主學習',
+    'hiteachview-title': 'HiTeach課堂記錄',
+    hiteachNote: {
+        material: '上課內容',
+        classInteractionRecord: '課堂互動記錄',
+        qA: '即問即答',
+        qAMulti: '即問即答(多選)',
+        reference: '參考答案',
+        correct: '答案正確',
+        groupQAMulti: '分組即問即答(多選)',
+        poImg: '教師從Hiteach推送了一張圖:',
+        link: '分享連結'
+    },
+    'courseList-title': '我的課程清單',
+    defaultClass: '表定課程',
+    tempClass: '臨時課程',
+    courseContent: {
+        baseInfo: '基本資訊',
+        description: '課程概述',
+        classmates: '同學名單',
+        classID: '課程代碼',
+        classTime: '上課時間',
+        classroom: '上課教室',
+        teacher: '授課教師',
+        'co-teacher': '協同教師',
+        addedTime: '加入課程日期',
+        syllabus: '課綱概覽',
+        seatNo: '座號',
+        name: '姓名',
+        group: '組別'
+    },
+    'calendar-title': '行事歷 - 109學年度第二學期',
+    today: '今天',
+    importEvent: '校園班級要事',
+    deadlineTasks: '截止活動任務',
+    schedule: '表定課表',
+    des: '描述',
+    time: '時間',
+    place: '地點',
+    course: '課程',
+    mockcourses: ['閱讀與寫作', '英文簡報', '電子電路專題實驗', '計算機概論', '微處理機實驗'],
+    importEventTitle: '校園班級要事',
+    Thatday: '當日',
+    deadlineTasksTitle: '當日截止未完成活動任務'
+}

+ 9 - 8
TEAMModelOS/ClientApp/src/locale/lang/zh-TW/totalAnalysis.js

@@ -80,7 +80,7 @@ export default {
 	goExamList:'查看更多評測',
 	goExamList:'查看更多評測',
 
 
 	// AchievementAnalysis.vue
 	// AchievementAnalysis.vue
-	ach_title1: '及格率統計',
+	ach_title1: '得分率統計',
 	ach_title2: '均分分析',
 	ach_title2: '均分分析',
 	ach_title3: '進線人數統計',
 	ach_title3: '進線人數統計',
 	ach_title4: '進線情况統計',
 	ach_title4: '進線情况統計',
@@ -94,7 +94,7 @@ export default {
 	ach_text4: '班級平均分',
 	ach_text4: '班級平均分',
 	ach_text5: '校級平均分',
 	ach_text5: '校級平均分',
 	ach_text6: '區級平均分',
 	ach_text6: '區級平均分',
-	ach_text7: '班級總人數',
+	ach_text7: '總人數',
 	ach_text8: '進線總人數',
 	ach_text8: '進線總人數',
 	ach_text9: '進線率',
 	ach_text9: '進線率',
 	ach_text10: '當前班級',
 	ach_text10: '當前班級',
@@ -136,7 +136,7 @@ export default {
 	sca_text8: '偶爾粗心準備不够充分',
 	sca_text8: '偶爾粗心準備不够充分',
 	sca_text9: '學習不够充分需要更加努力',
 	sca_text9: '學習不够充分需要更加努力',
 	sca_text10: '學習極不穩定對考試沒有充分準備',
 	sca_text10: '學習極不穩定對考試沒有充分準備',
-	sca_chart_text1: '通過率',
+	sca_chart_text1: '得分率',
 	sca_chart_text2: '穩定度',
 	sca_chart_text2: '穩定度',
 	sca_table_text1: '答對題數',
 	sca_table_text1: '答對題數',
 	sca_table_text2: '答錯題數',
 	sca_table_text2: '答錯題數',
@@ -149,7 +149,7 @@ export default {
 	ta_title1: '試題落點分析',
 	ta_title1: '試題落點分析',
 	ta_title2: '年級單題得分率統計',
 	ta_title2: '年級單題得分率統計',
 	ta_title3: '試題分析總表',
 	ta_title3: '試題分析總表',
-	ta_title4: '試題得分率',
+	ta_title4: '試題得分率',
 
 
 	ta_text1: '區域',
 	ta_text1: '區域',
 	ta_text2: '區域特性',
 	ta_text2: '區域特性',
@@ -216,9 +216,9 @@ export default {
 	ka_table_text6: '得分率',
 	ka_table_text6: '得分率',
 	ka_table_text7: '涉及題號',
 	ka_table_text7: '涉及題號',
 	ka_table_text8: '平均得分率',
 	ka_table_text8: '平均得分率',
-	ka_table_text9: '錯題人',
-	ka_table_text10: 'RH錯題人',
-	ka_table_text11: 'RL錯題人',
+	ka_table_text9: '錯題人',
+	ka_table_text10: 'RH錯題人',
+	ka_table_text11: 'RL錯題人',
 
 
 	ka_tip1: '* RH:高分區段 / RL:低分區段',
 	ka_tip1: '* RH:高分區段 / RL:低分區段',
 
 
@@ -260,7 +260,8 @@ export default {
 		option:'選項',
 		option:'選項',
 		answerRate:'選答率',
 		answerRate:'選答率',
 		RHRate:'高分組選答率',
 		RHRate:'高分組選答率',
-		RLRate:'低分組選答率'
+		RLRate:'低分組選答率',
+		tip:'*綠色代表進線,藍色代表踩線'
 	}
 	}
 
 
 }
 }

+ 0 - 1
TEAMModelOS/ClientApp/src/router/routes.js

@@ -120,7 +120,6 @@ export const routes = [
 							resolve),
 							resolve),
 					},
 					},
 					{
 					{
-						// name: 'earlyWarning',
 						path: '/total/achievement/earlyWarning',
 						path: '/total/achievement/earlyWarning',
 						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
 						component: resolve => require(['@/view/student-analysis/total-analysis/AchievementAnalysis/EarlyWarning.vue'],
 							resolve)
 							resolve)

+ 14 - 3
TEAMModelOS/ClientApp/src/utils/evTools.js

@@ -27,6 +27,7 @@ export default {
 					answer:item.answer,
 					answer:item.answer,
 					explain:item.explain,
 					explain:item.explain,
 					type:item.type,
 					type:item.type,
+					objective:this.getItemType(item.type),
 					opts:item.option.length,
 					opts:item.option.length,
 					knowledge:item.knowledge,
 					knowledge:item.knowledge,
 					field:item.field,
 					field:item.field,
@@ -37,8 +38,10 @@ export default {
 					children:item.children || [],
 					children:item.children || [],
 					scope:item.scope,
 					scope:item.scope,
 					score: item.score||0,
 					score: item.score||0,
-					count: item.count||1,
+					blankCount: item.blankCount||1,
 					repair:item.repair,
 					repair:item.repair,
+					createTime:new Date().getTime(),
+					creator:store.state.userInfo.TEAMModelId || 'null'
 				},
 				},
 				item:[{
 				item:[{
 					type:'Html',
 					type:'Html',
@@ -61,6 +64,7 @@ export default {
 				scope:item.scope,
 				scope:item.scope,
 				score:item.score||0,
 				score:item.score||0,
 				type:item.type,
 				type:item.type,
+				objective:this.getItemType(item.type),
 				question:this.getSimpleText(item.question),
 				question:this.getSimpleText(item.question),
 				knowledge:item.knowledge,
 				knowledge:item.knowledge,
 				field:item.field,
 				field:item.field,
@@ -69,8 +73,10 @@ export default {
 				gradeIds:item.gradeIds,
 				gradeIds:item.gradeIds,
 				subjectId:item.subjectId,
 				subjectId:item.subjectId,
 				repair:item.repair,
 				repair:item.repair,
-				count: item.count || 1,
-				blob:item.blob
+				blankCount: item.blankCount || 1,
+				blob:item.blob,
+				createTime:new Date().getTime(),
+				creator:store.state.userInfo.TEAMModelId || 'null'
 			}
 			}
 			r(cosmosItem)
 			r(cosmosItem)
 		})
 		})
@@ -460,6 +466,11 @@ export default {
 		return html.replace(r, "");
 		return html.replace(r, "");
 	},
 	},
 	
 	
+	getItemType(type){
+		const objective = ['single','multiple','judge']
+		return objective.includes(type)
+	},
+	
 	getImgSrc(richtext) {
 	getImgSrc(richtext) {
 	    let imgList = [];
 	    let imgList = [];
 	    richtext.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/g, (match, capture) => {
 	    richtext.replace(/<video [^>]*src=['"]([^'"]+)[^>]*>/g, (match, capture) => {

+ 9 - 4
TEAMModelOS/ClientApp/src/view/evaluation/bank/ExerciseList.vue

@@ -101,6 +101,11 @@
               " />
               " />
 					</span>
 					</span>
 				</div>
 				</div>
+				
+				<div class="exercise-item-children" v-if="item.children.length">
+					<BaseChild :children="item.children"></BaseChild>
+				</div>
+				
 				<!-- 选项部分 -->
 				<!-- 选项部分 -->
 				<div v-for="(option, optionIndex) in item.option" :key="optionIndex" class="item-options">
 				<div v-for="(option, optionIndex) in item.option" :key="optionIndex" class="item-options">
 					<div class="item-option-content">
 					<div class="item-option-content">
@@ -110,9 +115,9 @@
 						<div class="item-option-text" v-html="option.value"></div>
 						<div class="item-option-text" v-html="option.value"></div>
 					</div>
 					</div>
 				</div>
 				</div>
-				<transition name="slide">
+				<transition name="slide"  v-if="item.type !== 'compose'">
 					<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
 					<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
-						<div v-if="item.type !== 'compose'">
+						<div>
 							<!-- 答案展示部分 -->
 							<!-- 答案展示部分 -->
 							<div class="item-explain">
 							<div class="item-explain">
 								<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
 								<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
@@ -153,9 +158,9 @@
 							</div>
 							</div>
 						</div>
 						</div>
 						<!-- 如果是综合题 则加载子题渲染组件 -->
 						<!-- 如果是综合题 则加载子题渲染组件 -->
-						<div v-else>
+						<!-- <div v-else>
 							<BaseChild :children="item.children"></BaseChild>
 							<BaseChild :children="item.children"></BaseChild>
-						</div>
+						</div> -->
 					</div>
 					</div>
 				</transition>
 				</transition>
 				<!-- 底部题目操作栏 -->
 				<!-- 底部题目操作栏 -->

+ 114 - 76
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseChild.vue

@@ -1,12 +1,13 @@
 <template>
 <template>
 	<div class="child-wrap" ref="childRef">
 	<div class="child-wrap" ref="childRef">
-		<div class="child-item" v-for="(item,index) in children" :key="index">
+		<div class="child-item" v-for="(item,index) in children" :key="index"  @click.stop="onQuestionToggle(index, item.id, $event)">
 			<div class="child-item-question">
 			<div class="child-item-question">
-				<span class="child-item-question-order">【{{$t('evaluation.child')}}{{ index + 1 }}】</span>
+				<span class="child-item-question-order">({{ index + 1 }})</span>
 				<p class="child-item-question-content" v-html="item.question"></p>
 				<p class="child-item-question-content" v-html="item.question"></p>
 			</div>
 			</div>
 			<!-- 选项部分 -->
 			<!-- 选项部分 -->
-			<div v-for="(option,optionIndex) in item.option" :key="optionIndex" class="child-item-option" style="pointer-events:none">
+			<div v-for="(option,optionIndex) in item.option" :key="optionIndex" class="child-item-option"
+				style="pointer-events:none">
 				<div>
 				<div>
 					<div class="child-item-option-order">{{String.fromCharCode(64 + parseInt(optionIndex+1))}} : </div>
 					<div class="child-item-option-order">{{String.fromCharCode(64 + parseInt(optionIndex+1))}} : </div>
 					<div class="child-item-option-text" v-html="option.value"></div>
 					<div class="child-item-option-text" v-html="option.value"></div>
@@ -14,105 +15,141 @@
 			</div>
 			</div>
 			<div class="item-btn-toggle" v-if="isShowScore">
 			<div class="item-btn-toggle" v-if="isShowScore">
 				<template>
 				<template>
-					<InputNumber :max="totalScore" :min="0" v-model="item.score" style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;"
-					 @click.stop></InputNumber>
+					<InputNumber :max="totalScore" :min="0" v-model="item.score"
+						style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;" @click.stop>
+					</InputNumber>
 					<span style="margin-right: 20px;">{{$t('evaluation.paperList.score')}}</span>
 					<span style="margin-right: 20px;">{{$t('evaluation.paperList.score')}}</span>
 				</template>
 				</template>
 			</div>
 			</div>
-			<!-- 答案展示部分 -->
-			<div class="item-explain">
-				<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
-				<div class="item-explain-details">
-					<!-- 问答题答案 -->
-					<div v-if="item.type === 'subjective' || item.type === 'complete'">
-						<span v-for="(answer,index) in item.answer" :key="index" v-html="item.answer && item.answer.length ? answer : $t('evaluation.noAnswer')"></span>
-					</div>
-					<!-- 问答题答案 -->
-					<div v-else-if="item.type === 'judge'">
-						<span>{{ item.answer && item.answer.length ? (item.answer[0] === 'A' ? $t('evaluation.isTrue') : $t('evaluation.isFalse')) : $t('evaluation.answer') }}</span>
+
+
+			<transition name="slide">
+				<div v-show="collapseList.indexOf(children.indexOf(item)) > -1" class="toggle-area">
+					<!-- 答案展示部分 -->
+					<div class="item-explain">
+						<span class="explain-title">【{{$t('evaluation.answer')}}】</span>
+						<div class="item-explain-details">
+							<!-- 问答题答案 -->
+							<div v-if="item.type === 'subjective' || item.type === 'complete'">
+								<span v-for="(answer,index) in item.answer" :key="index"
+									v-html="item.answer && item.answer.length ? answer : $t('evaluation.noAnswer')"></span>
+							</div>
+							<!-- 问答题答案 -->
+							<div v-else-if="item.type === 'judge'">
+								<span>{{ item.answer && item.answer.length ? (item.answer[0] === 'A' ? $t('evaluation.isTrue') : $t('evaluation.isFalse')) : $t('evaluation.answer') }}</span>
+							</div>
+							<!-- 其余题型答案 -->
+							<div v-else>
+								<span :class="[ item.type === 'complete' ? 'item-answer-item':'']"
+									v-for="(answer,index) in item.answer" :key="index" v-html="answer"></span>
+							</div>
+						</div>
 					</div>
 					</div>
-					<!-- 其余题型答案 -->
-					<div v-else>
-						<span :class="[ item.type === 'complete' ? 'item-answer-item':'']" v-for="(answer,index) in item.answer" :key="index" v-html="answer"></span>
+					<!-- 解析部分 -->
+					<div class="item-explain">
+						<span class="explain-title">【{{$t('evaluation.explain')}}】</span>
+						<div class="item-explain-details">
+							<span v-html="item.explain || $t('evaluation.noExplain')"></span>
+						</div>
 					</div>
 					</div>
-				</div>
-			</div>
-			<!-- 解析部分 -->
-			<div class="item-explain">
-				<span class="explain-title">【{{$t('evaluation.explain')}}】</span>
-				<div class="item-explain-details">
-					<span v-html="item.explain || $t('evaluation.noExplain')"></span>
-				</div>
-			</div>
-			<!-- 知识点部分 -->
-			<div class="item-explain">
-				<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
-				<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" :key="index" class="item-point-tag">
-							<span>{{ point }}</span>
-						</span>
+					<!-- 知识点部分 -->
+					<div class="item-explain">
+						<span class="explain-title">【{{$t('evaluation.knowledgePoints')}}】</span>
+						<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" :key="index" class="item-point-tag">
+									<span>{{ point }}</span>
+								</span>
+							</div>
+						</div>
 					</div>
 					</div>
 				</div>
 				</div>
-			</div>
+			</transition>
+
 		</div>
 		</div>
 	</div>
 	</div>
 </template>
 </template>
 <script>
 <script>
 	import '@/utils/Math.uuid'
 	import '@/utils/Math.uuid'
 	export default {
 	export default {
-		name:'BaseChild',
+		name: 'BaseChild',
 		components: {},
 		components: {},
 		props: {
 		props: {
 			children: {
 			children: {
 				type: Array,
 				type: Array,
 				default: []
 				default: []
 			},
 			},
-			totalScore:{
-				type:Number,
-				default:0
+			totalScore: {
+				type: Number,
+				default: 0
 			},
 			},
-			isShowScore:{
-				type:Boolean,
-				default:false
+			isShowScore: {
+				type: Boolean,
+				default: false
 			}
 			}
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
-				surPlusScore:0
+				collapseList:[],
+				surPlusScore: 0
 			}
 			}
 		},
 		},
 		created() {
 		created() {
-			if(this.children && this.children.length){
+			if (this.children && this.children.length) {
 				this.children.forEach(i => {
 				this.children.forEach(i => {
-					if(!i.score){
+					if (!i.score) {
 						i.score = 0
 						i.score = 0
 					}
 					}
 					this.surPlusScore = this.totalScore - i.score
 					this.surPlusScore = this.totalScore - i.score
 				})
 				})
 			}
 			}
-			
+
 		},
 		},
 		methods: {
 		methods: {
 			/* 给小题配分 */
 			/* 给小题配分 */
-			doDistribution(){
-				
-			}
+			doDistribution() {
+
+			},
 			
 			
+			onQuestionToggle(index, id, e) {
+				let curClassName = e.target.className;
+				if (
+					curClassName === "item-tools" ||
+					curClassName === "richText-video" ||
+					curClassName === "richText-audio"
+				)
+					return;
+				e.stopPropagation();
+				let listIndex = this.collapseList.indexOf(index);
+				if (listIndex > -1) {
+					this.collapseList.splice(listIndex, 1);
+				} else {
+					this.collapseList.push(index);
+					let exerciseItemDom = e.path.filter(
+						(i) => i.className === "exercise-item"
+					);
+					// if (exerciseItemDom.length) {
+					// 	this.pageScrollTo(exerciseItemDom[0].offsetTop + 240);
+					// }
+				}
+			
+				this.$emit("toggleChange", this.collapseList);
+			},
+
 		},
 		},
 
 
 		watch: {
 		watch: {
-			children:{
-				handler(n){
-					this.$nextTick(()=>{
+			children: {
+				handler(n) {
+					this.$nextTick(() => {
 						// this.$MathJax.MathQueue(this.$refs.childRef);
 						// this.$MathJax.MathQueue(this.$refs.childRef);
 					})
 					})
 				}
 				}
 			},
 			},
-			totalScore:{
-				handler(n){
-					
+			totalScore: {
+				handler(n) {
+
 				}
 				}
 			}
 			}
 		}
 		}
@@ -123,39 +160,40 @@
 	@import "../index/CommonExercise.less";
 	@import "../index/CommonExercise.less";
 </style>
 </style>
 <style lang="less" scoped>
 <style lang="less" scoped>
-	.child-wrap{
-		.child-item{
+	.child-wrap {
+		.child-item {
 			position: relative;
 			position: relative;
-			margin:40px 10px 0 10px;
-			
-			&-question{
+			margin: 40px 10px 0 10px;
+
+			&-question {
 				font-size: 14px;
 				font-size: 14px;
 				// color:#01b087;
 				// color:#01b087;
-				
-				&-order{
-					 color:#10abe7;
-					 display: inline-block;
-					 width: 75px;
+
+				&-order {
+					// color: #10abe7;
+					display: inline-block;
+					width: 20px;
 				}
 				}
-				&-content{
+
+				&-content {
 					display: inline-block;
 					display: inline-block;
 					margin-left: 5px;
 					margin-left: 5px;
-					width: calc(90% - 75px);
+					width: calc(90% - 20px);
 					vertical-align: text-top;
 					vertical-align: text-top;
 				}
 				}
 			}
 			}
-			
-			&-option{
+
+			&-option {
 				font-size: 14px;
 				font-size: 14px;
 				margin: 10px 5px;
 				margin: 10px 5px;
 				margin-left: 80px;
 				margin-left: 80px;
-				
-				&-order{
+
+				&-order {
 					display: inline-block;
 					display: inline-block;
 					width: 25px;
 					width: 25px;
 				}
 				}
-				
-				&-text{
+
+				&-text {
 					display: inline-block;
 					display: inline-block;
 					margin-left: 5px;
 					margin-left: 5px;
 					width: calc(90% - 25px);
 					width: calc(90% - 25px);

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

@@ -248,7 +248,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "subjective":
 					case "subjective":
 						exerciseItem.question = this.$refs.subjective.stemContent;
 						exerciseItem.question = this.$refs.subjective.stemContent;

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

@@ -279,7 +279,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "connector":
 					case "connector":
 						exerciseItem.question = this.$refs.connector.stemContent;
 						exerciseItem.question = this.$refs.connector.stemContent;

+ 8 - 4
TEAMModelOS/ClientApp/src/view/evaluation/components/BaseExerciseList.vue

@@ -58,6 +58,9 @@
 							</div>
 							</div>
 						</div>
 						</div>
 					</div>
 					</div>
+					<div class="exercise-item-children" v-if="item.children.length">
+						<BaseChild :children="item.children"></BaseChild>
+					</div>
 					<div class="item-btn-toggle" @click.stop v-show="isShowTools && !isPreview" >
 					<div class="item-btn-toggle" @click.stop v-show="isShowTools && !isPreview" >
 						<template v-if="!isExamPaper">
 						<template v-if="!isExamPaper">
 							<InputNumber :max="item.score + surPlusScore" :min="0" v-model="item.score" style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;"
 							<InputNumber :max="item.score + surPlusScore" :min="0" v-model="item.score" style="display: inline-block ;width: 60px;margin-right: 10px;height: 30px;"
@@ -70,11 +73,12 @@
 						</template>
 						</template>
 						<Icon :type="collapseList.indexOf(index) > -1 ? 'ios-arrow-dropup' : 'ios-arrow-dropdown'" />
 						<Icon :type="collapseList.indexOf(index) > -1 ? 'ios-arrow-dropup' : 'ios-arrow-dropdown'" />
 					</div>
 					</div>
+					
 					<!-- 答案以及解析 -->
 					<!-- 答案以及解析 -->
-					<transition name="slide">
+					<transition name="slide" v-if="item.type !== 'compose'">
 						<!-- <div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area"> -->
 						<!-- <div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area"> -->
 						<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
 						<div v-show="collapseList.indexOf(exerciseList.indexOf(item)) > -1" class="toggle-area">
-							<div v-if="item.type !== 'compose'">
+							<div>
 								<!-- 答案展示部分 -->
 								<!-- 答案展示部分 -->
 								<div class="item-explain" v-show="isShowAnswer">
 								<div class="item-explain" v-show="isShowAnswer">
 									<span class="explain-title">【{{$t('evaluation.filter.type')}}】</span>
 									<span class="explain-title">【{{$t('evaluation.filter.type')}}】</span>
@@ -128,9 +132,9 @@
 								</div>
 								</div>
 							</div>
 							</div>
 							<!-- 如果是综合题 则加载子题渲染组件 -->
 							<!-- 如果是综合题 则加载子题渲染组件 -->
-							<div v-else>
+							<!-- <div v-else>
 								<BaseChild :children="item.children" :totalScore="item.score" :isShowScore="!isExamPaper"></BaseChild>
 								<BaseChild :children="item.children" :totalScore="item.score" :isShowScore="!isExamPaper"></BaseChild>
-							</div>
+							</div> -->
 						</div>
 						</div>
 					</transition>
 					</transition>
 				</div>
 				</div>

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

@@ -288,7 +288,7 @@
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.level = +this.exersicesDiff;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.explain = this.analysisContent;
 						exerciseItem.answer = [this.$refs.complete.answerContent];
 						exerciseItem.answer = [this.$refs.complete.answerContent];
-						exerciseItem.count = this.$refs.complete.count || 1;
+						exerciseItem.blankCount = this.$refs.complete.blankCount || 1;
 						break;
 						break;
 					case "subjective":
 					case "subjective":
 						exerciseItem.question = this.$refs.subjective.stemContent;
 						exerciseItem.question = this.$refs.subjective.stemContent;

+ 3 - 3
TEAMModelOS/ClientApp/src/view/evaluation/types/BaseCompletion.vue

@@ -9,7 +9,7 @@
 		<div class="exersices-option">
 		<div class="exersices-option">
 			<IconText :text="$t('evaluation.completeCount')" :color="'#0e9c50'" :icon="'md-compass'"></IconText>
 			<IconText :text="$t('evaluation.completeCount')" :color="'#0e9c50'" :icon="'md-compass'"></IconText>
 			</br>
 			</br>
-			<InputNumber v-model="count" :min="1" :editable="false" size="large"></InputNumber>
+			<InputNumber v-model="blankCount" :min="1" :editable="false" size="large"></InputNumber>
 		</div>
 		</div>
 		<div class="exersices-option">
 		<div class="exersices-option">
 			<IconText :text="$t('evaluation.newExercise.answerTitle')" :color="'#FF871C'" :icon="'md-reorder'"></IconText>
 			<IconText :text="$t('evaluation.newExercise.answerTitle')" :color="'#FF871C'" :icon="'md-reorder'"></IconText>
@@ -33,12 +33,12 @@
 				stemEditor: null,
 				stemEditor: null,
 				answerContent: '',
 				answerContent: '',
 				answerEditor: null,
 				answerEditor: null,
-				count:1
+				blankCount:1
 			}
 			}
 		},
 		},
 		methods: {
 		methods: {
 			doRender(){
 			doRender(){
-				this.count = this.editInfo.count || 1
+				this.blankCount = this.editInfo.blankCount || this.editInfo.count || 1
 				this.stemContent = this.editInfo.question
 				this.stemContent = this.editInfo.question
 				this.answerContent = this.editInfo.answer
 				this.answerContent = this.editInfo.answer
 				this.stemEditor.txt.html(this.editInfo.question)
 				this.stemEditor.txt.html(this.editInfo.question)

+ 54 - 59
TEAMModelOS/ClientApp/src/view/knowledge-point/index/Index.vue

@@ -8,7 +8,7 @@
 		<!-- 课纲头部 切换来源以及选择学段 -->
 		<!-- 课纲头部 切换来源以及选择学段 -->
 		<div class="new-syllabus-header common-save-btn">
 		<div class="new-syllabus-header common-save-btn">
 			<div class="new-syllabus-select">
 			<div class="new-syllabus-select">
-				<span>当前学段:</span>
+				<span>{{$t("knowledge.period")}}:</span>
 				<Select ref="periodSelect" v-model="currentPeriodIndex" style="width:100px;" @on-change="onPeriodChange">
 				<Select ref="periodSelect" v-model="currentPeriodIndex" style="width:100px;" @on-change="onPeriodChange">
 					<Option v-for="(item,index) in periodList" :value="index" :key="index">{{ item.name }}</Option>
 					<Option v-for="(item,index) in periodList" :value="index" :key="index">{{ item.name }}</Option>
 				</Select>
 				</Select>
@@ -25,12 +25,12 @@
 					<div class="ns-header-content" v-if="!isSearchSubject">
 					<div class="ns-header-content" v-if="!isSearchSubject">
 						<span>
 						<span>
 							<Icon type="md-bookmark" color="#fff" size="20" />
 							<Icon type="md-bookmark" color="#fff" size="20" />
-							<span style="margin-left:5px">学科</span>
+							<span style="margin-left:5px">{{$t("knowledge.subject")}}</span>
 						</span>
 						</span>
 						<Icon type="ios-search" color="#fff" size="18" v-show="subjectList.length" style="cursor:pointer" @click="isSearchSubject = true" />
 						<Icon type="ios-search" color="#fff" size="18" v-show="subjectList.length" style="cursor:pointer" @click="isSearchSubject = true" />
 					</div>
 					</div>
 					<div class="ns-header-search" v-else>
 					<div class="ns-header-search" v-else>
-						<Input icon="ios-close" v-model="searchSubject" placeholder="搜索学科..." autofocus style="width: 100%" @on-click="onSearchSubjectClose"
+						<Input icon="ios-close" v-model="searchSubject" :placeholder="$t('knowledge.searchSubject')" autofocus style="width: 100%" @on-click="onSearchSubjectClose"
 						 @on-change="onSearchSubjectChange" @on-enter="onSearchSubjectChange" />
 						 @on-change="onSearchSubjectChange" @on-enter="onSearchSubjectChange" />
 					</div>
 					</div>
 				</div>
 				</div>
@@ -42,7 +42,7 @@
 						<div :class='["gl-item",index == activeSubjectIndex ? "item-active":""]' v-for="(item,index) in subjectList" :key="index"
 						<div :class='["gl-item",index == activeSubjectIndex ? "item-active":""]' v-for="(item,index) in subjectList" :key="index"
 						 @click="hasModify ? handleConfirmSave({index},'2') : handleSubjectTap(index)">
 						 @click="hasModify ? handleConfirmSave({index},'2') : handleSubjectTap(index)">
 							<p class="gl-item-name">{{item.name}}</p>
 							<p class="gl-item-name">{{item.name}}</p>
-							<p class="gl-item-info"><span></span>知识块数:{{ tabIndex === 0  ? schoolBlockCount[index] : privateBlockCount[index]}}</p>
+							<p class="gl-item-info"><span></span>{{$t("knowledge.blockCount")}}:{{ tabIndex === 0  ? schoolBlockCount[index] : privateBlockCount[index]}}</p>
 						</div>
 						</div>
 					</div>
 					</div>
 				</vuescroll>
 				</vuescroll>
@@ -56,15 +56,15 @@
 					<div class="ns-header-content" v-if="!isSearchPoint">
 					<div class="ns-header-content" v-if="!isSearchPoint">
 						<span>
 						<span>
 							<Icon type="md-cube" color="#fff" size="20" />
 							<Icon type="md-cube" color="#fff" size="20" />
-							<span style="margin-left:5px">知识点 ( {{ originPointList.length }} )</span>
-							<Input icon="ios-close" v-model="searchPoint" v-show="originPointList.length" placeholder="搜索知识点..." autofocus style="width: 300px;margin-left: 20px;"
+							<span style="margin-left:5px">{{$t("knowledge.point")}} ( {{ originPointList.length }} )</span>
+							<Input icon="ios-close" v-model="searchPoint" v-show="originPointList.length" :placeholder="$t('knowledge.searchPoint')" autofocus style="width: 300px;margin-left: 20px;"
 							 @on-click="onSearchClear" @on-blur="isSearchPoint = false" @on-change="onSearchPointChange" @on-enter="onSearchPointChange"
 							 @on-click="onSearchClear" @on-blur="isSearchPoint = false" @on-change="onSearchPointChange" @on-enter="onSearchPointChange"
 							 @on-clear="onSearchClear" />
 							 @on-clear="onSearchClear" />
 						</span>
 						</span>
 						<div>
 						<div>
 							<Icon type="md-add" v-if="($access.can('admin.*|Point_Add')) && subjectList.length" color="#fff" size="18" style="cursor:pointer;margin-right:10px"
 							<Icon type="md-add" v-if="($access.can('admin.*|Point_Add')) && subjectList.length" color="#fff" size="18" style="cursor:pointer;margin-right:10px"
 							 @click="onAddPoint" />
 							 @click="onAddPoint" />
-							<Button class="btn-compose-block" v-if="checkedPointList.length" @click="onComposeBlock">组成知识块</Button>
+							<Button class="btn-compose-block" v-if="checkedPointList.length" @click="onComposeBlock">{{$t("knowledge.makeBlock")}}</Button>
 						</div>
 						</div>
 					</div>
 					</div>
 					<div class="ns-header-search" v-else>
 					<div class="ns-header-search" v-else>
@@ -80,11 +80,11 @@
 									 @click="onPointCheck(item,index)" draggable="true" @dragstart="onDragStart(item)" @dragend="isDragging = false">
 									 @click="onPointCheck(item,index)" draggable="true" @dragstart="onDragStart(item)" @dragend="isDragging = false">
 										<span>{{item}}</span>
 										<span>{{item}}</span>
 										<span class="point-item-tools">
 										<span class="point-item-tools">
-											<span class="btn-edit" v-if="$access.can('admin.*|Point_Edit') || tabIndex === 1" title="编辑" @click.stop="onEditPoint(item,index)">
+											<span class="btn-edit" v-if="$access.can('admin.*|Point_Edit') || tabIndex === 1" :title="$t('knowledge.edit')" @click.stop="onEditPoint(item,index)">
 												<Icon type="md-create" size="18" color="#d2d2d2" /></span>
 												<Icon type="md-create" size="18" color="#d2d2d2" /></span>
-											<span class="btn-delete" v-if="$access.can('admin.*|Point_Delete') || tabIndex === 1" title="删除" @click.stop="onDeletePoint(item,index)">
+											<span class="btn-delete" v-if="$access.can('admin.*|Point_Delete') || tabIndex === 1" :title="$t('knowledge.delete')" @click.stop="onDeletePoint(item,index)">
 												<Icon type="md-trash" size="20" color="#d2d2d2" /></span>
 												<Icon type="md-trash" size="20" color="#d2d2d2" /></span>
-											<span class="btn-delete" v-if="$access.can('admin.*|Point_Remove') && isBlockPoint(item)" title="移出知识块"
+											<span class="btn-delete" v-if="$access.can('admin.*|Point_Remove') && isBlockPoint(item)" :title="$t('knowledge.moveBlock')"
 											 @click.stop="onRemovePoint(item)">
 											 @click.stop="onRemovePoint(item)">
 												<Icon type="md-remove-circle" size="20" color="#d2d2d2" /></span>
 												<Icon type="md-remove-circle" size="20" color="#d2d2d2" /></span>
 										</span>
 										</span>
@@ -103,7 +103,7 @@
 					<div class="ns-header-content" v-if="!isSearchBlock">
 					<div class="ns-header-content" v-if="!isSearchBlock">
 						<span>
 						<span>
 							<Icon type="ios-photos" color="#fff" size="20" />
 							<Icon type="ios-photos" color="#fff" size="20" />
-							<span style="margin-left:5px">知识块</span>
+							<span style="margin-left:5px">{{$t("knowledge.block")}}</span>
 						</span>
 						</span>
 						<div>
 						<div>
 							<Icon type="md-add" v-if="($access.can('admin.*|Block_Add') || tabIndex === 1)  && subjectList.length" color="#fff" size="18" style="cursor:pointer;margin-right:10px"
 							<Icon type="md-add" v-if="($access.can('admin.*|Block_Add') || tabIndex === 1)  && subjectList.length" color="#fff" size="18" style="cursor:pointer;margin-right:10px"
@@ -113,7 +113,7 @@
 					</div>
 					</div>
 					<div class="ns-header-search" v-else>
 					<div class="ns-header-search" v-else>
 						<!-- 搜索知识块部分 -->
 						<!-- 搜索知识块部分 -->
-						<Input icon="ios-close" v-model="searchBlock" placeholder="搜索知识块..." autofocus style="width: 100%" @on-click="onSearchBlockClose"
+						<Input icon="ios-close" v-model="searchBlock" :placeholder="$t('knowledge.searchBlock')" autofocus style="width: 100%" @on-click="onSearchBlockClose"
 						 @on-change="onSearchBlockChange" @on-enter="onSearchBlockChange" />
 						 @on-change="onSearchBlockChange" @on-enter="onSearchBlockChange" />
 					</div>
 					</div>
 				</div>
 				</div>
@@ -123,23 +123,23 @@
 						<div v-if="blockList.length === 0">
 						<div v-if="blockList.length === 0">
 							<div class="gl-item gl-new-area" v-show="isDragging" @drop="onDragNewEnd" @dragover.prevent>
 							<div class="gl-item gl-new-area" v-show="isDragging" @drop="onDragNewEnd" @dragover.prevent>
 								<Icon type="md-add" size="18" />
 								<Icon type="md-add" size="18" />
-								<span style="margin-left: 10px;">新建知识块</span>
+								<span style="margin-left: 10px;">{{$t("knowledge.buildBlock")}}</span>
 							</div>
 							</div>
 							<EmptyData :top="50"></EmptyData>
 							<EmptyData :top="50"></EmptyData>
 						</div>
 						</div>
 						<div v-else>
 						<div v-else>
 							<div class="gl-item gl-new-area" v-show="isDragging" @drop="onDragNewEnd" @dragover.prevent>
 							<div class="gl-item gl-new-area" v-show="isDragging" @drop="onDragNewEnd" @dragover.prevent>
 								<Icon type="md-add" size="18" />
 								<Icon type="md-add" size="18" />
-								<span style="margin-left: 10px;">新建知识块</span>
+								<span style="margin-left: 10px;">{{$t("knowledge.buildBlock")}}</span>
 							</div>
 							</div>
 							<div :class='["gl-item","drag-block-item",index == activeBlockIndex ? "item-active":""]' v-for="(item,index) in blockList"
 							<div :class='["gl-item","drag-block-item",index == activeBlockIndex ? "item-active":""]' v-for="(item,index) in blockList"
 							 :key="index" @click="handleBlockTap(index,item)" @drop="onDragEnd(item,index,$event)" @dragover.prevent
 							 :key="index" @click="handleBlockTap(index,item)" @drop="onDragEnd(item,index,$event)" @dragover.prevent
 							 @dragend="onDragEnd(item,index)" @dragenter="onDragEnter" @dragleave="onDragLeave">
 							 @dragend="onDragEnd(item,index)" @dragenter="onDragEnter" @dragleave="onDragLeave">
 								<p class="gl-item-name" :title="item.name">{{item.name}}</p>
 								<p class="gl-item-name" :title="item.name">{{item.name}}</p>
-								<p class="gl-item-info"><span></span>知识点数:{{item.points ? item.points.length : 0}}</p>
-								<span class="btn-edit" v-if="$access.can('admin.*|Block_Edit') || tabIndex === 1" title="编辑" @click.stop="onEditBlock(index)">
+								<p class="gl-item-info"><span></span>{{$t("knowledge.pointCount")}}:{{item.points ? item.points.length : 0}}</p>
+								<span class="btn-edit" v-if="$access.can('admin.*|Block_Edit') || tabIndex === 1" :title="$t('knowledge.edit')" @click.stop="onEditBlock(index)">
 									<Icon type="md-create" size="20" color="#d2d2d2" /></span>
 									<Icon type="md-create" size="20" color="#d2d2d2" /></span>
-								<span class="btn-delete" v-if="$access.can('admin.*|Block_Delete') || tabIndex === 1" title="删除" @click.stop="onDeleteBlock(item)">
+								<span class="btn-delete" v-if="$access.can('admin.*|Block_Delete') || tabIndex === 1" :title="$t('knowledge.delete')" @click.stop="onDeleteBlock(item)">
 									<Icon type="md-trash" size="22" color="#d2d2d2" /></span>
 									<Icon type="md-trash" size="22" color="#d2d2d2" /></span>
 							</div>
 							</div>
 						</div>
 						</div>
@@ -152,7 +152,7 @@
 
 
 		<!-- 新增知识块弹窗 -->
 		<!-- 新增知识块弹窗 -->
 		<Modal v-model="isAddBlock" width="560" footer-hide class="add-volume-modal">
 		<Modal v-model="isAddBlock" width="560" footer-hide class="add-volume-modal">
-			<div class="modal-header" slot="header">{{ isEditBlock ? '编辑知识块' : '新增知识块'}}</div>
+			<div class="modal-header" slot="header">{{ isEditBlock ? $t('knowledge.editBlock') : $t('knowledge.addBlock')}}</div>
 			<div class="modal-content">
 			<div class="modal-content">
 				<AddBlock :originData="originSchoolData" :periodIndex="currentPeriodIndex" :subjectIndex="currentSubjectIndex"
 				<AddBlock :originData="originSchoolData" :periodIndex="currentPeriodIndex" :subjectIndex="currentSubjectIndex"
 				 :editBlock="editBlock" :addType="pointOwn" @addFinish="onFinishAddBlock" :orginBlock="originBlockList">
 				 :editBlock="editBlock" :addType="pointOwn" @addFinish="onFinishAddBlock" :orginBlock="originBlockList">
@@ -162,7 +162,7 @@
 
 
 		<!-- 新增知识点弹窗 -->
 		<!-- 新增知识点弹窗 -->
 		<Modal v-model="isAddPoint" width="560" footer-hide class="add-volume-modal">
 		<Modal v-model="isAddPoint" width="560" footer-hide class="add-volume-modal">
-			<div class="modal-header" slot="header">{{ isEditPoint ? '编辑知识点' : '新增知识点'}}</div>
+			<div class="modal-header" slot="header">{{ isEditPoint ? $t('knowledge.editPoint') : $t('knowledge.addPoint')}}</div>
 			<div class="modal-content">
 			<div class="modal-content">
 				<AddPoint :hideBlock="isShowPoints" :schoolParams="schoolParams" :blockData="parentBlock" :orginPoint="originPointList" :pointData="currentPoint"
 				<AddPoint :hideBlock="isShowPoints" :schoolParams="schoolParams" :blockData="parentBlock" :orginPoint="originPointList" :pointData="currentPoint"
 				 :addType="pointOwn" @addFinish="onFinishAddPoint">
 				 :addType="pointOwn" @addFinish="onFinishAddPoint">
@@ -172,7 +172,7 @@
 
 
 		<!-- 组成知识块弹窗 -->
 		<!-- 组成知识块弹窗 -->
 		<Modal v-model="isComposeBlock" width="680" footer-hide class="add-volume-modal compose-modal">
 		<Modal v-model="isComposeBlock" width="680" footer-hide class="add-volume-modal compose-modal">
-			<div class="modal-header" slot="header">组成知识块</div>
+			<div class="modal-header" slot="header">{{$t("knowledge.makeBlock")}}</div>
 			<ComposeBlock :list="checkedPointList" :params="currentParams" :blockList="originBlockList" @onFinish="onComposeFinish"></ComposeBlock>
 			<ComposeBlock :list="checkedPointList" :params="currentParams" :blockList="originBlockList" @onFinish="onComposeFinish"></ComposeBlock>
 		</Modal>
 		</Modal>
 	</div>
 	</div>
@@ -296,26 +296,26 @@ import { json } from 'd3'
 					let addPointIds = new Set([...checkPointIds].filter(x => !blockPointIds.has(x)))
 					let addPointIds = new Set([...checkPointIds].filter(x => !blockPointIds.has(x)))
 					if (addPointIds.size > 0) {
 					if (addPointIds.size > 0) {
 						this.$Modal.confirm({
 						this.$Modal.confirm({
-							title: '提示',
-							content: `确定将 ${this.curDragPoint} 等 ${addPointIds.size} 个知识点移入到知识块 ${blockItem.name} 中 (已存在的知识点会自动忽略)?`,
-							okText: '确认',
-							cancelText: '取消',
+                            title: this.$t('knowledge.notice'),
+                            content: `${this.$t('knowledge.content0')} ${this.curDragPoint} ${this.$t('knowledge.content2')} ${addPointIds.size} ${this.$t('knowledge.content3')} ${blockItem.name} ${this.$t('knowledge.content1')}`,
+                            okText: this.$t('knowledge.confirm'),
+                            cancelText: this.$t('knowledge.cancel'),
 							onOk: () => {
 							onOk: () => {
 								blockItem.points.push(...addPointIds)
 								blockItem.points.push(...addPointIds)
 							}
 							}
 						})
 						})
 					} else {
 					} else {
-						this.$Message.warning('所选知识点已存在于该知识块中!')
+                        this.$Message.warning(this.$t('knowledge.notice1'))
 					}
 					}
 				} else {
 				} else {
 					if (blockItem.points.includes(this.curDragPoint)) {
 					if (blockItem.points.includes(this.curDragPoint)) {
-						this.$Message.warning('该知识块已存在当前知识点!')
+                        this.$Message.warning(this.$t('knowledge.notice2'))
 					} else {
 					} else {
 						this.$Modal.confirm({
 						this.$Modal.confirm({
-							title: '提示',
-							content: `确定将知识点 ${this.curDragPoint} 移入到知识块 ${blockItem.name} 中?`,
-							okText: '确认',
-							cancelText: '取消',
+                            title: this.$t('knowledge.notice'),
+                            content: `${this.$t('knowledge.content4')} ${this.curDragPoint} ${this.$t('knowledge.content5')} ${blockItem.name}${this.$t('knowledge.content6')}`,
+                            okText: this.$t('knowledge.confirm'),
+                            cancelText: this.$t('knowledge.cancel'),
 							onOk: () => {
 							onOk: () => {
 								blockItem.points.push(this.curDragPoint)
 								blockItem.points.push(this.curDragPoint)
 							}
 							}
@@ -349,15 +349,14 @@ import { json } from 'd3'
 							this.isLoading = false
 							this.isLoading = false
 							this.checkedPointList = []
 							this.checkedPointList = []
 							this.initBlockCount()
 							this.initBlockCount()
-							this.$Message.success('操作成功!')
+                            this.$Message.success(this.$t('knowledge.success'))
 							r(200)
 							r(200)
 						} else {
 						} else {
                             this.isLoading = false
                             this.isLoading = false
-							this.$Message.warning('操作失败,错误代码:' + res.error.code + ',错误信息:' + res.error.message)
 						}
 						}
 					}).catch(err => {
 					}).catch(err => {
 						j(err)
 						j(err)
-						this.$Message.warning('操作失败')
+                        this.$Message.warning(this.$t('knowledge.fail'))
 					})
 					})
 				})
 				})
 			},
 			},
@@ -408,7 +407,6 @@ import { json } from 'd3'
 				this.$api.knowledge.GetSchoolPoints(params).then(res => {
 				this.$api.knowledge.GetSchoolPoints(params).then(res => {
 					console.log(res.length)
 					console.log(res.length)
                     if (res.length > 0) {
                     if (res.length > 0) {
-                        console.log('知识点', JSON.stringify(res))
                         that.pointDatas = res
                         that.pointDatas = res
                         let list = res[0].blocks
                         let list = res[0].blocks
                         this.blockList = list
                         this.blockList = list
@@ -436,7 +434,7 @@ import { json } from 'd3'
                         this.originBlockList = JSON.parse(JSON.stringify(list))
                         this.originBlockList = JSON.parse(JSON.stringify(list))
                     } 
                     } 
 				}).catch(err => {
 				}).catch(err => {
-					this.$Message.error('知识块数据获取失败')
+                    this.$Message.error(this.$t('knowledge.warn'))
 					this.isLoadBlocks = false
 					this.isLoadBlocks = false
 				})
 				})
 			},
 			},
@@ -564,7 +562,7 @@ import { json } from 'd3'
 
 
 			// 添加知识块完成
 			// 添加知识块完成
 			onFinishAddBlock(val) {
 			onFinishAddBlock(val) {
-				this.$Message.success('操作成功!')
+                this.$Message.success(this.$t('knowledge.success'))
 				if (this.isEditBlock) {
 				if (this.isEditBlock) {
 					let code = this.blockList.findIndex(item => item.name.indexOf(this.editBlock.name) > -1)
 					let code = this.blockList.findIndex(item => item.name.indexOf(this.editBlock.name) > -1)
 					this.blockList[code].name = val.name
 					this.blockList[code].name = val.name
@@ -631,10 +629,10 @@ import { json } from 'd3'
 			// 删除知识块事件
 			// 删除知识块事件
 			onDeleteBlock(data) {
 			onDeleteBlock(data) {
 				this.$Modal.confirm({
 				this.$Modal.confirm({
-					title: '提示',
-					content: '<p>确认删除该知识块?</p>',
-					okText: '确认',
-					cancelText: '取消',
+                    title: this.$t('knowledge.notice'),
+                    content: this.$t('knowledge.delBlock'),
+                    okText: this.$t('knowledge.confirm'),
+                    cancelText: this.$t('knowledge.cancel'),
 					onOk: () => {
 					onOk: () => {
 						let that = this
 						let that = this
 						this.isLoading = true
 						this.isLoading = true
@@ -646,10 +644,10 @@ import { json } from 'd3'
 								that.blockCounts = []
 								that.blockCounts = []
 								//that.initBlockCount()
 								//that.initBlockCount()
 								that.isLoading = false
 								that.isLoading = false
-								that.$Message.success('删除成功')
+                                that.$Message.success(this.$t('knowledge.delSuccess'))
 							}, 1000)
 							}, 1000)
 						} else {
 						} else {
-							this.$Message.success('删除失败')
+                            this.$Message.success(this.$t('knowledge.delFail'))
 						}
 						}
 					}
 					}
 				})
 				})
@@ -658,13 +656,13 @@ import { json } from 'd3'
 			// 删除知识点事件
 			// 删除知识点事件
 			onDeletePoint(data) {
 			onDeletePoint(data) {
 				this.$Modal.confirm({
 				this.$Modal.confirm({
-					title: '提示',
-					content: '<p>确认删除该知识点?</p>',
-					okText: '确认',
-					cancelText: '取消',
+                    title: this.$t('knowledge.notice'),
+                    content: this.$t('knowledge.delPoint'),
+                    okText: this.$t('knowledge.confirm'),
+                    cancelText: this.$t('knowledge.cancel'),
 					onOk: () => {
 					onOk: () => {
 						this.isLoadPoints = true
 						this.isLoadPoints = true
-                        this.$Message.success('删除成功')
+                        this.$Message.success(this.$t('knowledge.delSuccess'))
                         this.pointList.splice(this.pointList.indexOf(data), 1)
                         this.pointList.splice(this.pointList.indexOf(data), 1)
                         if (!this.isShowPoints) this.currentBlock.points.splice(this.currentBlock.points.indexOf(data), 1)
                         if (!this.isShowPoints) this.currentBlock.points.splice(this.currentBlock.points.indexOf(data), 1)
 						this.actionPoint(data, 0)
 						this.actionPoint(data, 0)
@@ -677,19 +675,16 @@ import { json } from 'd3'
 			// 移除知识点事件
 			// 移除知识点事件
 			onRemovePoint(data) {
 			onRemovePoint(data) {
 				this.$Modal.confirm({
 				this.$Modal.confirm({
-					title: '提示',
-					content: `确定将知识点 ${data} 从知识块 ${this.currentBlock.name} 中移除?`,
-					okText: '确认',
-					cancelText: '取消',
+                    title: this.$t('knowledge.notice'),
+                    content: `${this.$t('knowledge.content7')} ${data} ${this.$t('knowledge.content8')} ${this.currentBlock.name} ${this.$t('knowledge.content9')}`,
+                    okText: this.$t('knowledge.confirm'),
+                    cancelText: this.$t('knowledge.cancel'),
 					onOk: () => {
 					onOk: () => {
 						if (this.currentBlock.points.includes(data)) {
 						if (this.currentBlock.points.includes(data)) {
 							this.currentBlock.points.splice(this.currentBlock.points.indexOf(data), 1)
 							this.currentBlock.points.splice(this.currentBlock.points.indexOf(data), 1)
 							this.originBlockList = [...this.blockList]
 							this.originBlockList = [...this.blockList]
-								//this.curBlockPoints = []
-								//this.currentBlock = null
-								//this.activeBlockIndex = null
 						} else {
 						} else {
-							this.$Message.error('移除失败')
+                            this.$Message.error(this.$t('knowledge.moveFail'))
 						}
 						}
 					}
 					}
 				})
 				})
@@ -760,7 +755,7 @@ import { json } from 'd3'
 					this.checkedPointList = []
 					this.checkedPointList = []
 					this.activeBlockIndex = null
 					this.activeBlockIndex = null
 					this.curBlockPoints = []
 					this.curBlockPoints = []
-					this.$Message.success('操作成功')
+                    this.$Message.success(this.$t('knowledge.success'))
 					//this.initBlockCount()
 					//this.initBlockCount()
 				}
 				}
 			},
 			},
@@ -825,14 +820,14 @@ import { json } from 'd3'
                     console.log(params)
                     console.log(params)
                     this.$api.knowledge.SaveOrUpdateKnowledge(params).then(res => {
                     this.$api.knowledge.SaveOrUpdateKnowledge(params).then(res => {
                         if (res) {
                         if (res) {
-							this.$Message.success('保存数据成功')
+                            this.$Message.success(this.$t('knowledge.saveSuccess'))
 							this.getPointsData()
 							this.getPointsData()
 							this.initBlockCount()
 							this.initBlockCount()
                         } else {
                         } else {
-                            this.$Message.warning('保存数据失败')
+                            this.$Message.warning(this.$t('knowledge.saveFail'))
                         }
                         }
                     }).catch(err => {
                     }).catch(err => {
-                        this.$Message.error('数据保存失败')
+                        this.$Message.error(this.$t('knowledge.saveFail'))
                         this.isLoadBlocks = false
                         this.isLoadBlocks = false
                     })
                     })
                 }
                 }

+ 6 - 6
TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/AddBlock.vue

@@ -2,13 +2,13 @@
 <template>
 <template>
     <div class="form-container">
     <div class="form-container">
         <Form :model="formTop" label-position="top">
         <Form :model="formTop" label-position="top">
-            <FormItem label="科目">
+            <!--<FormItem :label="$t('knowledge.subject')">
                 <Select v-model="formTop.subject">
                 <Select v-model="formTop.subject">
                     <Option v-for="(item,index) in currentPeriod.subjects" :value="item.id" :key="index">{{ item.name }}</Option>
                     <Option v-for="(item,index) in currentPeriod.subjects" :value="item.id" :key="index">{{ item.name }}</Option>
                 </Select>
                 </Select>
-            </FormItem>
-            <FormItem label="名称">
-                <Input v-model="formTop.name" placeholder="请输入知识块名称,必填项"></Input>
+            </FormItem>-->
+            <FormItem :label="$t('knowledge.label')">
+                <Input v-model="formTop.name" :placeholder="$t('knowledge.blockP')" />
                 <vuescroll>
                 <vuescroll>
                     <ul class="search-list" v-show="filterData.length > 0">
                     <ul class="search-list" v-show="filterData.length > 0">
                         <li v-for="(list,index) in filterData">
                         <li v-for="(list,index) in filterData">
@@ -18,7 +18,7 @@
                 </vuescroll>
                 </vuescroll>
             </FormItem>
             </FormItem>
             <FormItem>
             <FormItem>
-                <Button @click="handleSubmit" :loading="isLoading">确认</Button>
+                <Button @click="handleSubmit" :loading="isLoading">{{$t("knowledge.confirm")}}</Button>
             </FormItem>
             </FormItem>
         </Form>
         </Form>
     </div>
     </div>
@@ -56,7 +56,7 @@
             handleSubmit() {
             handleSubmit() {
                 let newName = this.formTop.name
                 let newName = this.formTop.name
                 if (!newName) {
                 if (!newName) {
-                    this.$Message.warning('知识块名称不能为空!')
+                    this.$Message.warning(this.$t('knowledge.blockWarning'))
                 } else {
                 } else {
                     this.isLoading = true
                     this.isLoading = true
                     let params = {
                     let params = {

+ 5 - 31
TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/AddPoint.vue

@@ -2,12 +2,11 @@
 <template>
 <template>
     <div class="form-container">
     <div class="form-container">
         <Form :model="formTop" label-position="top">
         <Form :model="formTop" label-position="top">
-            <FormItem label="知识块" v-show="!hideBlock">
+            <FormItem :label="$t('knowledge.block')" v-show="!hideBlock">
                 <Input v-model="formTop.blockName" disabled />
                 <Input v-model="formTop.blockName" disabled />
             </FormItem>
             </FormItem>
-            <FormItem label="名称">
-                <Input v-model="formTop.name" placeholder="请输入知识点名称,必填项" />
-                <!--<span v-show="filterData.length > 0">已有知识点:</span>-->
+            <FormItem :label="$t('knowledge.label')">
+                <Input v-model="formTop.name" :placeholder="$t('knowledge.knowledgeP')" />
                 <vuescroll>
                 <vuescroll>
                     <ul class="search-list" v-show="filterData.length > 0">
                     <ul class="search-list" v-show="filterData.length > 0">
                         <li v-for="(list,index) in filterData">
                         <li v-for="(list,index) in filterData">
@@ -17,7 +16,7 @@
                 </vuescroll>
                 </vuescroll>
             </FormItem>
             </FormItem>
             <FormItem>
             <FormItem>
-                <Button @click="handleAddPointSubmit()" :loading="isLoading">确认</Button>
+                <Button @click="handleAddPointSubmit()" :loading="isLoading">{{$t("knowledge.confirm")}}</Button>
             </FormItem>
             </FormItem>
         </Form>
         </Form>
     </div>
     </div>
@@ -51,14 +50,10 @@
         methods: {
         methods: {
             // 提交添加
             // 提交添加
             handleAddPointSubmit() {
             handleAddPointSubmit() {
-                console.log(this.formTop)
-                console.log(this.orginPoint)
-                console.log(this.filterData)
                 let newName = this.formTop.name
                 let newName = this.formTop.name
                 if (!newName) {
                 if (!newName) {
-                    this.$Message.warning('知识点名称不能为空!')
+                    this.$Message.warning(this.$t('knowledge.knowledgeWarning'))
                 } else {
                 } else {
-                    //let editPointItem = this.currentPoint
                     this.isLoading = true
                     this.isLoading = true
                     let params = {
                     let params = {
                         name: newName,
                         name: newName,
@@ -73,27 +68,6 @@
                 }
                 }
             },
             },
 
 
-            /**
-             * 保存知识点
-             * @param pointItem
-             * @param BlockItem
-             */
-            savePointAndBlock(pointItem) {
-                this.$api.knowledge.SaveOrUpdateKnowledge([pointItem]).then(res => {
-                    if (!res.error && res.knowledges.length) {
-                        this.$emit('addFinish', res.knowledges[0])
-                        this.closeModal()
-                        this.currentPoint = null
-                        this.isLoading = false
-                    } else {
-                        this.$Message.warning('操作失败,错误代码:' + res.error.code + ',错误信息:' + res.error.message)
-                    }
-                }).catch(err => {
-                    this.$Message.warning('操作失败')
-                })
-				this.isLoading = false
-            },
-
             // 添加完成 关闭窗口
             // 添加完成 关闭窗口
             closeModal() {
             closeModal() {
                 this.formTop.name = ''
                 this.formTop.name = ''

+ 10 - 11
TEAMModelOS/ClientApp/src/view/knowledge-point/index/operation/ComposeBlock.vue

@@ -2,15 +2,15 @@
 <template>
 <template>
     <div class="compose-container">
     <div class="compose-container">
         <Tabs value="0" @on-click="onTabChange">
         <Tabs value="0" @on-click="onTabChange">
-            <TabPane label="新增知识块" icon="md-folder" name="0">
+            <TabPane :label="$t('knowledge.newBlock')" icon="md-folder" name="0">
                 <div class="tab-content">
                 <div class="tab-content">
-                    <p class="tab-title">添加知识块</p>
-                    <Input v-model="newBlockName" placeholder="输入知识块名称" style="width: 98%;margin-left:1%" />
+                    <p class="tab-title">{{$t("knowledge.addBlock")}}</p>
+                    <Input v-model="newBlockName" :placeholder="$t('knowledge.blockP')" style="width: 98%;margin-left:1%" />
                 </div>
                 </div>
             </TabPane>
             </TabPane>
-            <TabPane label="现有知识块" icon="md-cube" name="1">
+            <TabPane :label="$t('knowledge.nowBlock')" icon="md-cube" name="1">
                 <div class="tab-content">
                 <div class="tab-content">
-                    <p class="tab-title">选择知识块 ( *若所选知识块内已存在添加的知识点则会覆盖 )</p>
+                    <p class="tab-title">{{$t("knowledge.nowBlockN")}}</p>
                     <Select v-model="selectBlock" transfer style="width: 98%;margin-left:1%">
                     <Select v-model="selectBlock" transfer style="width: 98%;margin-left:1%">
                         <Option v-for="(item,index) in existBlockList" :value="item.name" :key="index">{{ item.name }}</Option>
                         <Option v-for="(item,index) in existBlockList" :value="item.name" :key="index">{{ item.name }}</Option>
                     </Select>
                     </Select>
@@ -19,7 +19,7 @@
         </Tabs>
         </Tabs>
 
 
         <div class="show-wrap">
         <div class="show-wrap">
-            <p class="tab-title">已选知识点</p>
+            <p class="tab-title">{{$t("knowledge.selectPoint")}}</p>
             <div class="show-list">
             <div class="show-list">
                 <span class="point-item" v-for="(item,index) in checkedList" :key="index">
                 <span class="point-item" v-for="(item,index) in checkedList" :key="index">
                 {{ item }}
                 {{ item }}
@@ -28,7 +28,7 @@
             </div>
             </div>
         </div>
         </div>
 
 
-        <Button @click="currentTab === '0' ? handleSubmitNew() : handleSubmit()" :loading="isLoading">确认</Button>
+        <Button @click="currentTab === '0' ? handleSubmitNew() : handleSubmit()" :loading="isLoading">{{$t("knowledge.confirm")}}</Button>
     </div>
     </div>
 </template>
 </template>
 
 
@@ -65,7 +65,7 @@
                     let list = this.existBlockList.map(item => item.name)
                     let list = this.existBlockList.map(item => item.name)
                     let isExistIndex = list.indexOf(this.newBlockName)
                     let isExistIndex = list.indexOf(this.newBlockName)
                     if (isExistIndex > -1) {
                     if (isExistIndex > -1) {
-                        this.$Message.warning('已存在同名知识块,请修改名称!')
+                        this.$Message.warning(this.$t('knowledge.blockWarning2'))
                         this.isLoading = false
                         this.isLoading = false
                     } else {
                     } else {
                         let params = {
                         let params = {
@@ -77,14 +77,13 @@
                         this.newBlockName = ''
                         this.newBlockName = ''
                     }
                     }
                 } else {
                 } else {
-                    this.$Message.warning('知识块名称不能为空')
+                    this.$Message.warning(this.$t('knowledge.blockWarning3'))
                     this.isLoading = false
                     this.isLoading = false
                 }
                 }
             },
             },
 
 
             // 提交新增知识块
             // 提交新增知识块
             handleSubmit() {
             handleSubmit() {
-                console.log('156313561',this.existBlockList)
                 if (this.existBlockList.length) {
                 if (this.existBlockList.length) {
                     this.isLoading = true
                     this.isLoading = true
 					let selectBlockItem = this.existBlockList.filter(item => item.name === this.selectBlock)[0]
 					let selectBlockItem = this.existBlockList.filter(item => item.name === this.selectBlock)[0]
@@ -94,7 +93,7 @@
                     this.$emit('onFinish', selectBlockItem)
                     this.$emit('onFinish', selectBlockItem)
                     this.isLoading = false
                     this.isLoading = false
 				}else{
 				}else{
-					this.$Message.warning('无现有知识块选择!')
+					this.$Message.warning(this.$t('knowledge.blockWarning4'))
 				}
 				}
                 
                 
             },
             },

+ 7 - 4
TEAMModelOS/ClientApp/src/view/learnactivity/CreatePrivEva.vue

@@ -665,7 +665,8 @@ export default {
                 endTime: this.evaluationInfo.endTime,
                 endTime: this.evaluationInfo.endTime,
                 scope: this.evaluationInfo.scope,
                 scope: this.evaluationInfo.scope,
                 createDate: Math.round(new Date()),
                 createDate: Math.round(new Date()),
-                blobcntr: this.evaluationInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId //后面新增字段
+                // blobcntr: this.evaluationInfo.scope == 'school' ? this.$store.state.userInfo.schoolCode : this.$store.state.userInfo.TEAMModelId //后面新增字段 (废弃)
+                owner: 'teacher' //后面新增字段
             }
             }
 
 
             this.$api.learnActivity.SaveExamInfo(requestData).then(
             this.$api.learnActivity.SaveExamInfo(requestData).then(
@@ -687,8 +688,8 @@ export default {
                         } else {
                         } else {
                             targetBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                             targetBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                         }
                         }
-                        console.log('scope',this.evaluationInfo.scope)
-                        console.log('target',targetBlob)
+                        console.log('scope', this.evaluationInfo.scope)
+                        console.log('target', targetBlob)
                         let privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                         let privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                         let schoolBlob = undefined
                         let schoolBlob = undefined
                         let targetFolder = 'exam/' + examId + '/paper/'
                         let targetFolder = 'exam/' + examId + '/paper/'
@@ -724,7 +725,7 @@ export default {
                                         }
                                         }
                                     }
                                     }
                                 )
                                 )
-                            } 
+                            }
                             //挑选的是个人试卷
                             //挑选的是个人试卷
                             else if (item.scope == 'private') {
                             else if (item.scope == 'private') {
                                 if (!privateBlob) privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
                                 if (!privateBlob) privateBlob = new BlobTool(privateSas.url, privateSas.name, privateSas.sas, 'private')
@@ -777,12 +778,14 @@ export default {
                         paper.point = []
                         paper.point = []
                         paper.knowledge = []
                         paper.knowledge = []
                         paper.field = []
                         paper.field = []
+                        paper.type = []//后面新增字段, 保存每个题目类型
                         for (let k = 0; k < rule[i].slides.length; k++) {
                         for (let k = 0; k < rule[i].slides.length; k++) {
                             if (rule[i].slides[k].type !== 'compose') {
                             if (rule[i].slides[k].type !== 'compose') {
                                 paper.answers.push(rule[i].slides[k].scoring.ans ? rule[i].slides[k].scoring.ans : [])
                                 paper.answers.push(rule[i].slides[k].scoring.ans ? rule[i].slides[k].scoring.ans : [])
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
+                                paper.type.push(rule[i].slides[k].type) //后面新增字段, 保存每个题目类型
                             }
                             }
                         }
                         }
                         paperDto.push(paper)
                         paperDto.push(paper)

+ 4 - 1
TEAMModelOS/ClientApp/src/view/learnactivity/CreateSchoolEva.vue

@@ -502,7 +502,8 @@ export default {
                 endTime: this.evaluationInfo.endTime,
                 endTime: this.evaluationInfo.endTime,
                 scope: this.mode,
                 scope: this.mode,
                 createDate: Math.round(new Date()),
                 createDate: Math.round(new Date()),
-                blobcntr: this.$store.state.userInfo.schoolCode //后面新增字段
+                // blobcntr: this.$store.state.userInfo.schoolCode //后面新增字段 (废弃)
+                owner:'school' //后面新增字段
             }
             }
 
 
             this.$api.learnActivity.SaveExamInfo(requestData).then(
             this.$api.learnActivity.SaveExamInfo(requestData).then(
@@ -601,12 +602,14 @@ export default {
                         paper.point = []
                         paper.point = []
                         paper.knowledge = []
                         paper.knowledge = []
                         paper.field = []
                         paper.field = []
+                        paper.type = []//后面新增字段, 保存每个题目类型
                         for (let k = 0; k < rule[i].slides.length; k++) {
                         for (let k = 0; k < rule[i].slides.length; k++) {
                             if (rule[i].slides[k].type !== 'compose') {
                             if (rule[i].slides[k].type !== 'compose') {
                                 paper.answers.push(rule[i].slides[k].scoring.ans ? rule[i].slides[k].scoring.ans : [])
                                 paper.answers.push(rule[i].slides[k].scoring.ans ? rule[i].slides[k].scoring.ans : [])
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.point.push(rule[i].slides[k].scoring.score)
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.knowledge.push(rule[i].slides[k].scoring.knowledge ? rule[i].slides[k].scoring.knowledge : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
                                 paper.field.push(rule[i].slides[k].scoring.field ? rule[i].slides[k].scoring.field : [])
+                                paper.type.push(rule[i].slides[k].type) //后面新增字段, 保存每个题目类型
                             }
                             }
                         }
                         }
                         paperDto.push(paper)
                         paperDto.push(paper)

+ 3 - 3
TEAMModelOS/ClientApp/src/view/learnactivity/PrivScoring.vue

@@ -3,10 +3,10 @@
         <vuescroll ref="score-main-warp">
         <vuescroll ref="score-main-warp">
             <SimpleAnalysis :examInfo="examInfo" v-show="!showTest" :overviewInfo="overviewInfo"></SimpleAnalysis>
             <SimpleAnalysis :examInfo="examInfo" v-show="!showTest" :overviewInfo="overviewInfo"></SimpleAnalysis>
             <div class="ev-target-box dark-iview-select">
             <div class="ev-target-box dark-iview-select">
-                <span class="filter-label" v-if="examInfo.grades && examInfo.grades.length > 0">{{$t('learnActivity.score.gradeLabel')}}</span>
+                <!-- <span class="filter-label" v-if="examInfo.grades && examInfo.grades.length > 0">{{$t('learnActivity.score.gradeLabel')}}</span>
                 <Select filterable v-model="chooseGrade" class="filter-select" size="small" v-if="examInfo.grades && examInfo.grades.length > 0" style="margin-right:5px" transfer>
                 <Select filterable v-model="chooseGrade" class="filter-select" size="small" v-if="examInfo.grades && examInfo.grades.length > 0" style="margin-right:5px" transfer>
                     <Option v-for="(item,index) in examInfo.grades" :value="item.id" :key="index">{{ item.name }}</Option>
                     <Option v-for="(item,index) in examInfo.grades" :value="item.id" :key="index">{{ item.name }}</Option>
-                </Select>
+                </Select> -->
                 <span>{{$t('learnActivity.score.classLabel')}}</span>
                 <span>{{$t('learnActivity.score.classLabel')}}</span>
                 <Select filterable v-model="chooseClass" class="filter-select" style="width:140px;" @on-change="getClassStudent" size="small" transfer>
                 <Select filterable v-model="chooseClass" class="filter-select" style="width:140px;" @on-change="getClassStudent" size="small" transfer>
                     <Option v-for="(item,index) in classList" :value="item.id" :key="index">{{ item.name }}</Option>
                     <Option v-for="(item,index) in classList" :value="item.id" :key="index">{{ item.name }}</Option>
@@ -259,7 +259,7 @@ export default {
                 else {
                 else {
                     let requestData = {
                     let requestData = {
                         ids: [this.chooseClass],
                         ids: [this.chooseClass],
-                        scope: this.examInfo.scope == 'private' ? 'private' : 'school',
+                        scope: this.examInfo.scope,
                         // school_code: this.examInfo.scope == 'private' ? this.$store.state.userInfo.TEAMModelId : this.$store.state.userInfo.schoolCode,
                         // school_code: this.examInfo.scope == 'private' ? this.$store.state.userInfo.TEAMModelId : this.$store.state.userInfo.schoolCode,
                         school_code: this.$store.state.userInfo.schoolCode
                         school_code: this.$store.state.userInfo.schoolCode
                     }
                     }

+ 100 - 0
TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.less

@@ -0,0 +1,100 @@
+@first-bgColor: #141414;
+@second-bgColor: #1b1b1b;
+@third-bgColor: #222222;
+@borderColor: #424242;
+@primary-textColor: #fff; //文本主颜色
+@second-textColor: #a5a5a5; //文本副级颜色
+@primary-fontSize: 14px;
+@second-fontSize: 16px;
+
+.cus-table-container {
+    width: 100%;
+    // height: ~"calc(100% - 45px)";
+    height: 100%;
+    padding: 15px 0px 15px 10px;
+}
+.sch-title {
+    color: white;
+    text-align: center;
+    font-size: 25px;
+}
+
+.week-day-cell {
+    height: 76px;
+    position: relative;
+    cursor: pointer;
+}
+
+/*.week-day-cell:hover {
+    background: #404040;
+}*/
+
+.week-day-cell:hover {
+    .toggle-status-btn {
+        display: inline-block;
+    }
+}
+
+.vact-status {
+    background: linear-gradient( to top right, rgba(96,96,96, 0) 0%, rgba(96,96,96, 0) calc(50% - 1px), rgba(96,96,96, 1) 50%, rgba(96,96,96, 0) calc(50% + 1px), rgba(96,96,96, 0) 100% ) !important;
+}
+.cus-table-top {
+    width: 100%;
+    position: relative;
+    color: white;
+    // padding-top: 15px;
+}
+
+.course-name {
+    padding: 12px 4px 0px 4px;
+    font-size: 18px;
+    font-weight: 800;
+    text-overflow:ellipsis; 
+    overflow:hidden; 
+    white-space:nowrap; 
+}
+.course-color{
+    color: #ff9900;
+}
+.classroom-color{
+    color: #ff9900 !important;
+}
+.classroom-name {
+    color: #a5a5a5;
+    font-size: 14px;
+}
+.week-day-cell:hover .toggle-status-btn-wrap{
+    display:block;
+}
+.toggle-status-btn-wrap {
+    position: absolute;
+    left: 0px;
+    right: 0px;
+    top: 0px;
+    bottom: 0px;
+    background: rgba(100,100,100,.8);
+    display: none;
+}
+.cell-action-icon{
+    color:white;
+    font-size:22px;
+    margin:25px 5px 0px 5px;
+    &:hover{
+        color:#1cc0f3;
+    }
+
+}
+.am-pm{
+    padding:10px 0px 4px 0px;
+    font-size: 20px;
+    writing-mode: vertical-lr;
+    height:150px;
+    margin: auto;
+    letter-spacing: 4px;
+}
+.no-class-tips{
+    color: white;
+    text-align: center;
+    margin: 15px 0px;
+    font-size: 16px;
+}

+ 461 - 0
TEAMModelOS/ClientApp/src/view/newcourse/ClassTable.vue

@@ -0,0 +1,461 @@
+<template>
+    <div class="cus-table-container dark-iview-table">
+        <vuescroll>
+            <div class="cus-table-top dark-iview-input dark-iview-select">
+                <div class="class-filter-wrap">
+                </div>
+            </div>
+            <Table :columns="timeColumns" disabled-hover :data="timetable" border :span-method="handleSpan" style="width:calc(100% - 15px);margin-top:00px;">
+                <!--上午/下午-->
+                <template slot-scope="{ row, index }" slot="sub">
+                    <p class="am-pm" style="">
+                        {{parseInt(row.time.substr(0,2)) > 12 ? $t('cusMgt.pm') : $t('cusMgt.am')}}
+                    </p>
+                </template>
+                <!--时段-->
+                <template slot-scope="{ row, index }" slot="time">
+                    <p style="padding:10px 0px 4px 0px;font-size: 20px;">
+                        {{row.time}}
+                    </p>
+                    <p style="font-size:12px;padding:4px 0px 10px 0px;">
+                        {{'('+row.label+')'}}
+                    </p>
+                </template>
+                <!--星期一-->
+                <template slot-scope="{ row, column }" slot="MON">
+                    <div :class="row.weeklies.MON.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <div class="toggle-status-btn-wrap" v-show="mode == 'set'">
+                            <Icon class="cell-action-icon" v-show="!row.weeklies[column.slot].courseName" custom="iconfont icon-choose" :title="$t('cusMgt.setCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-create" :title="$t('cusMgt.modifyCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-close" :title="$t('cusMgt.cancelCus')" @click="cancelCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="schd.setCus && schd.setTea" type="md-copy" :title="$t('cusMgt.repeat')" @click="copyCell(row, column.slot)" />
+                        </div>
+                        <p :class="['course-name']">{{row.weeklies.MON.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.MON.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期二-->
+                <template slot-scope="{ row, column }" slot="TUE">
+                    <div :class="row.weeklies.TUE.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <div class="toggle-status-btn-wrap" v-show="mode == 'set'">
+                            <Icon class="cell-action-icon" v-show="!row.weeklies[column.slot].courseName" custom="iconfont icon-choose" :title="$t('cusMgt.setCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-create" :title="$t('cusMgt.modifyCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-close" :title="$t('cusMgt.cancelCus')" @click="cancelCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="schd.setCus && schd.setTea" type="md-copy" :title="$t('cusMgt.repeat')" @click="copyCell(row, column.slot)" />
+                        </div>
+                        <p :class="['course-name']">{{row.weeklies.TUE.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.TUE.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期三-->
+                <template slot-scope="{ row, column }" slot="WED">
+                    <div :class="row.weeklies.WED.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <div class="toggle-status-btn-wrap" v-show="mode == 'set'">
+                            <Icon class="cell-action-icon" v-show="!row.weeklies[column.slot].courseName" custom="iconfont icon-choose" :title="$t('cusMgt.setCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-create" :title="$t('cusMgt.modifyCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-close" :title="$t('cusMgt.cancelCus')" @click="cancelCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="schd.setCus && schd.setTea" type="md-copy" :title="$t('cusMgt.repeat')" @click="copyCell(row, column.slot)" />
+                        </div>
+                        <p :class="['course-name']">{{row.weeklies.WED.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.WED.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期四-->
+                <template slot-scope="{ row, column }" slot="THU">
+                    <div :class="row.weeklies.THU.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <div class="toggle-status-btn-wrap" v-show="mode == 'set'">
+                            <Icon class="cell-action-icon" v-show="!row.weeklies[column.slot].courseName" custom="iconfont icon-choose" :title="$t('cusMgt.setCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-create" :title="$t('cusMgt.modifyCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-close" :title="$t('cusMgt.cancelCus')" @click="cancelCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="schd.setCus && schd.setTea" type="md-copy" :title="$t('cusMgt.repeat')" @click="copyCell(row, column.slot)" />
+                        </div>
+                        <p :class="['course-name']">{{row.weeklies.THU.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.THU.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期五-->
+                <template slot-scope="{ row, column }" slot="FRI">
+                    <div :class="row.weeklies.FRI.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <div class="toggle-status-btn-wrap" v-show="mode == 'set'">
+                            <Icon class="cell-action-icon" v-show="!row.weeklies[column.slot].courseName" custom="iconfont icon-choose" :title="$t('cusMgt.setCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-create" :title="$t('cusMgt.modifyCus')" @click="selectCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="row.weeklies[column.slot].courseName" type="md-close" :title="$t('cusMgt.cancelCus')" @click="cancelCell(row, column.slot)" />
+                            <Icon class="cell-action-icon" v-show="schd.setCus && schd.setTea" type="md-copy" :title="$t('cusMgt.repeat')" @click="copyCell(row, column.slot)" />
+                        </div>
+                        <p :class="['course-name']">{{row.weeklies.FRI.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.FRI.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期六-->
+                <template slot-scope="{ row, column }" slot="SAT">
+                    <div :class="row.weeklies.SAT.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <p :class="['course-name']">{{row.weeklies.SAT.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.SAT.teacherName}}</p>
+                    </div>
+                </template>
+                <!--星期日-->
+                <template slot-scope="{ row, column }" slot="SUN">
+                    <div :class="row.weeklies.SUN.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
+                        <p :class="['course-name']">{{row.weeklies.SUN.courseName}}</p>
+                        <p :class="['classroom-name']">{{row.weeklies.SUN.teacherName}}</p>
+                    </div>
+                </template>
+            </Table>
+        </vuescroll>
+        <Modal v-model="modalStatus" :title="$t('cusMgt.cusClass')" @on-ok="modalOk" @on-cancel="modalCancel" class-name="dark-iview-modal dark-iview-form dark-iview-select">
+            <Form ref="setCusForm" :model="schd" :label-width="60" label-colon :rules="ruleValidate">
+                <FormItem :label="$t('cusMgt.course')" prop="setCus">
+                    <Select v-show="cusListShow.length" v-model="schd.setCus" filterable style="width:90%;" @on-change="getCusFullInfo">
+                        <Option v-for="(item,index) in cusListShow" :key="index" :value="item.id">{{item.name}}</Option>
+                    </Select>
+                </FormItem>
+                <FormItem :label="$t('cusMgt.teaLabel')" prop="setTea">
+                    <Select v-model="schd.setTea" filterable style="width:90%;" :not-found-text="schd.setCus ? $t('cusMgt.noAddTea') : $t('cusMgt.sltCusTips')">
+                        <Option v-for="(item,index) in cusTeaList" :key="index" :value="item.id" @click.native="setTeaName(item)">{{item.name}}</Option>
+                    </Select>
+                </FormItem>
+            </Form>
+        </Modal>
+    </div>
+</template>
+<script>
+export default {
+    props: {
+        periodId: {
+            type: String,
+            default: ''
+        },
+        //课程对象数据
+        schedData: {
+            type: Array,
+            default: () => {
+                return []
+            }
+        },
+        classId: {
+            type: String,
+            default: '',
+            required: true
+        },
+        mode: {
+            type: String,
+            default: 'set' //set:设置模式 view:视图模式,只渲染功能
+        }
+    },
+    data() {
+        return {
+            cusList: [],
+            classList: [],
+            setClass: '',
+            schd: {
+                setCus: '',
+                setTea: '',
+                teaName: ''
+            },
+            ruleValidate: {
+                setCus: [
+                    { required: true, message: this.$t('cusMgt.setCusWarning'), trigger: 'change' }
+                ],
+                setTea: [
+                    { required: true, message: this.$t('cusMgt.setTeaWarning'), trigger: 'change' }
+                ]
+            },
+            modalStatus: false,
+            subIndex: 0,
+            schoolBase: {
+                period: []
+            },
+            timeColumns: [
+                {
+                    title: ' ',
+                    slot: 'sub',
+                    width: 80,
+                    align: 'center',
+                    className: 'custom-bg'
+                },
+                {
+                    title: ' ',
+                    slot: 'time',
+                    width: 160,
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.mon'),
+                    slot: 'MON',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.tue'),
+                    slot: 'TUE',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.wed'),
+                    slot: 'WED',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.thu'),
+                    slot: 'THU',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.fri'),
+                    slot: 'FRI',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.sat'),
+                    slot: 'SAT',
+                    align: 'center'
+                },
+                {
+                    title: this.$t('cusMgt.sun'),
+                    slot: 'SUN',
+                    align: 'center'
+                }
+            ],
+            selectInfo: {}
+        }
+    },
+    methods: {
+        //设置教师姓名
+        setTeaName(data) {
+            this.schd.teaName = data.name
+        },
+        //获取课程完整信息
+        getCusFullInfo(data) {
+            let cusIndex = -1
+            let cus = this.cusList.find((item, index) => {
+                cusIndex = index
+                return item.id == data
+            })
+            if (cus && !cus.schedule) {
+                //获取课程完整信息
+                let requestData = {
+                    'code': this.$store.state.userInfo.schoolCode,
+                    'scope': 'school',
+                    'id': data
+                }
+                this.$api.courseMgmt.findCusInfo(requestData).then(
+                    (res) => {
+                        if (!res.error && res.courses && res.courses.length > 0) {
+                            res.courses[0].schedule = res.courses[0].schedule ? res.courses[0].schedule : []
+                            this.$set(this.cusList, cusIndex, res.courses[0])
+                        }
+                    }
+                )
+            }
+        },
+        copyCell(row, col) {
+            let data = {
+                row,
+                col,
+                cusId: this.schd.setCus,
+                teaId: this.schd.setTea,
+                teaName: this.schd.teaName,
+                course: this.cusListShow.find(item => {
+                    return item.id == this.schd.setCus
+                })
+            }
+            this.$emit('selectCell', data)
+        },
+        selectCell(row, col) {
+            this.modalStatus = true
+            this.selectInfo = { row, col }
+        },
+        modalOk() {
+            this.$refs['setCusForm'].validate((valid) => {
+                if (valid) {
+                    let data = this._.cloneDeep(this.selectInfo)
+                    data.cusId = this.schd.setCus //当前设置的课程
+                    data.teaId = this.schd.setTea //当前设置的教师
+                    data.teaName = this.schd.teaName //当前设置的教师名字
+                    data.course = this.cusListShow.find(item => {
+                        return item.id == this.schd.setCus
+                    })
+                    this.$emit('selectCell', data)
+                } else {
+                    this.$Message.error(this.$t('cusMgt.formTips'))
+                }
+            })
+        },
+        cancelCell(row, col) {
+            this.$emit('cancelCell', { row, col })
+        },
+        modalCancel() {
+
+        },
+        //根据上下午合并单元格
+        handleSpan({ row, column, rowIndex, columnIndex }) {
+            this.getSubIndex()
+            if (rowIndex === 0 && columnIndex === 0) {
+                return [this.subIndex, 1]
+            } else if (rowIndex < this.subIndex && columnIndex === 0) {
+                return [0, 0]
+            }
+            if (rowIndex == this.subIndex && columnIndex === 0) {
+                return [this.timetable.length - this.subIndex, 1]
+            } else if (rowIndex > this.subIndex && columnIndex === 0) {
+                return [0, 0]
+            }
+        },
+        getSubIndex() {
+            for (let index in this.timetable) {
+                if (parseInt(this.timetable[index].time.substr(0, 2)) > 12) {
+                    this.subIndex = parseInt(index)
+                    break
+                }
+            }
+        },
+        //获取课程列表
+        getCourseList() {
+            let requestData = {
+                'code': this.$store.state.userInfo.schoolCode,
+                'scope': 'school'
+            }
+            this.$api.courseMgmt.findCourse(requestData).then(
+                (res) => {
+                    if (res) {
+                        this.cusList = res.courses
+                    }
+                }
+            ).finally(() => {
+                setTimeout(() => {
+                    this.tableLoading = false
+                    this.listLoading = false
+                }, 500)
+            })
+        },
+    },
+    created() {
+        //直接读取登录成功拿到得学校基础信息
+        this.$store.dispatch('user/getSchoolProfile').then(
+            res => {
+                this.schoolBase = res.school_base
+                this.classList = res.school_classes
+            },
+            err => {
+                this.$Message.warning(this.$t('cusMgt.noSchool'))
+            }
+        )
+        this.getCourseList()
+    },
+    watch: {
+        classId() {
+            this.schd = {
+                setCus: '',
+                setTea: ''
+            }
+        }
+    },
+    computed: {
+        //当前课程的授课老师
+        cusTeaList() {
+            if (this.schd.setCus) {
+                let cus = this.cusList.find(item => {
+                    return item.id == this.schd.setCus
+                })
+                if (cus && cus.schedule) {
+                    let all = cus.schedule.map(item => {
+                        return {
+                            id: item.teacherId,
+                            name: item.teacherName
+                        }
+                    })
+                    const res = new Map()
+                    let removeRep = all.filter((a) => !res.has(a.id) && res.set(a.id, 1))
+                    return removeRep
+                } else {
+                    return []
+                }
+            }
+            return []
+        },
+        //筛选当前学段的课程
+        cusListShow() {
+            if (this.periodId) {
+                let res = this.cusList.filter(item => {
+                    return item.period.id == this.periodId
+                })
+                return res
+            }
+            return this.cusList
+        },
+        timetable() {
+            let curPrd = this.schoolBase.period.find(item => {
+                return item.id == this.periodId
+            })
+            curPrd = curPrd || this.schoolBase.period[0] //没有传pdId就默认第一个
+            if (curPrd && curPrd.timetable) {
+                let timetable = this._.cloneDeep(curPrd.timetable)
+                timetable.forEach(item => {
+                    item.weeklies = {
+                        MON: {
+                            status: 1
+                        },
+                        TUE: {
+                            status: 1
+                        },
+                        WED: {
+                            status: 1
+                        },
+                        THU: {
+                            status: 1
+                        },
+                        FRI: {
+                            status: 1
+                        },
+                        SAT: {},
+                        SUN: {},
+                    }
+                    // 根据课程数据补充课程表
+                    this.schedData.forEach(cusItem => {
+                        if (cusItem.schedule) {
+                            cusItem.schedule.forEach((schedItem, sIndex) => {
+                                // 只渲染当前班级的schedule
+                                if (schedItem.classId == this.classId) {
+                                    let classInfo = this.classList.find(classItem => {
+                                        return classItem.id == schedItem.classId
+                                    })
+                                    if (this.classId) {
+                                        if (this.classId != schedItem.classId) {
+                                            return false
+                                        }
+                                    }
+                                    schedItem.time.forEach(timeItem => {
+                                        if (timeItem.id == item.id) {
+                                            item.weeklies[timeItem.week].courseName = cusItem.name
+                                            item.weeklies[timeItem.week].courseId = cusItem.id
+                                            item.weeklies[timeItem.week].classId = schedItem.classId
+                                            item.weeklies[timeItem.week].className = classInfo ? classInfo.name : '--'
+                                            item.weeklies[timeItem.week].teacherName = schedItem.teacherName
+                                            item.weeklies[timeItem.week].teacherId = schedItem.teacherId
+                                        }
+                                    })
+                                }
+
+                            })
+
+                        }
+                    })
+                })
+                return timetable
+            } else {
+                return []
+            }
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+@import "./ClassTable.less";
+</style>
+<style lang="less">
+.cus-table-container .ivu-table {
+    width: 100%;
+}
+.ivu-table .custom-bg {
+    background: #404040 !important;
+}
+</style>

+ 8 - 3
TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.less

@@ -118,13 +118,15 @@
 }
 }
 .cus-table {
 .cus-table {
     width: ~"calc(100% - 15px)";
     width: ~"calc(100% - 15px)";
-    margin-top: 25px;
+    margin-top: 15px;
 }
 }
 .sch-title {
 .sch-title {
     color: white;
     color: white;
     text-align: center;
     text-align: center;
-    padding-top: 5px;
-    font-size: 25px;
+    padding-top: 10px;
+    font-size: 20px;
+    // position: sticky;
+    top: 0px;
 }
 }
 .cus-table-top{
 .cus-table-top{
     width:100%;
     width:100%;
@@ -174,4 +176,7 @@
         cursor: not-allowed !important;
         cursor: not-allowed !important;
         color: #606060 !important;
         color: #606060 !important;
     }
     }
+}
+.cus-table-content{
+    height: ~"calc(100% - 45px)";
 }
 }

+ 172 - 376
TEAMModelOS/ClientApp/src/view/newcourse/CoursePlan.vue

@@ -3,11 +3,11 @@
         <div class="class-list-wrap">
         <div class="class-list-wrap">
             <div class="class-list-header">
             <div class="class-list-header">
                 <div v-if="!isSearch">
                 <div v-if="!isSearch">
-                    <span>班级列表</span>
+                    <BasePdSelect @pd-change="filterByPeriod"></BasePdSelect>
                     <Icon type="md-search" class="action-btn-icon" @click="toggleSearch" />
                     <Icon type="md-search" class="action-btn-icon" @click="toggleSearch" />
                 </div>
                 </div>
                 <div v-else class="dark-iview-input">
                 <div v-else class="dark-iview-input">
-                    <Input icon="ios-close" v-model="classFilter.keyWord" placeholder="关键字搜索..." autofocus style="width:calc(100% - 15px)" @on-click="toggleSearch" @on-change="onSearchClass" @on-enter="onSearchClass" />
+                    <Input icon="ios-close" v-model="classFilter.keyWord" :placeholder="$t('cusMgt.searchHolder')" autofocus style="width:calc(100% - 100px);float:right;margin-top:6px;margin-right:8px" @on-click="toggleSearch" @on-change="onSearchClass" @on-enter="onSearchClass" />
                 </div>
                 </div>
             </div>
             </div>
             <div class="class-list-content">
             <div class="class-list-content">
@@ -28,130 +28,27 @@
         </div>
         </div>
         <div class="cus-table-wrap">
         <div class="cus-table-wrap">
             <div class="cus-table-header common-save-btn">
             <div class="cus-table-header common-save-btn">
-                <span>课程表</span>
+                <span>{{$t('cusMgt.cusTable')}}</span>
                 <div class="action-btn-wrap">
                 <div class="action-btn-wrap">
                     <span v-if="$access.can('admin.*|course-upd')" @click="showImportCus()" class="action-btn">
                     <span v-if="$access.can('admin.*|course-upd')" @click="showImportCus()" class="action-btn">
                         <Icon custom="iconfont icon-upload" size="16" />
                         <Icon custom="iconfont icon-upload" size="16" />
-                        <span>导入课表</span>
+                        <span>{{$t('cusMgt.importLabel')}}</span>
                     </span>
                     </span>
                     <span v-if="$access.can('admin.*|course-upd')" @click="toggleView()" class="action-btn" style="margin-right:40px">
                     <span v-if="$access.can('admin.*|course-upd')" @click="toggleView()" class="action-btn" style="margin-right:40px">
                         <Icon custom="iconfont icon-kecheng" size="16" />
                         <Icon custom="iconfont icon-kecheng" size="16" />
-                        <span>课程模式</span>
+                        <span>{{$t('cusMgt.cusMode')}}</span>
                     </span>
                     </span>
                 </div>
                 </div>
             </div>
             </div>
             <div class="cus-table-content dark-iview-table">
             <div class="cus-table-content dark-iview-table">
                 <vuescroll>
                 <vuescroll>
-                    <div class="cus-table-top dark-iview-input dark-iview-select">
-                        <div class="semester-filter-wrap">
-                            <!--<span class="label">学期</span>
-                        <Select v-model="semester" size="small" style="width: 200px;display:inline-block;">
-                            <Option v-for="(item,index) in semesterList.semesters" :value="item.semesterCode">{{item.semesterName}}</Option>
-                        </Select>-->
-                        </div>
-                        <h1 class="sch-title">课程表</h1>
-                    </div>
-                    <div v-if="this.classListShow[this.curClassIndex]">
-                        <Table :columns="timeColumns" disabled-hover :data="classListShow[curClassIndex].classPlan" border :span-method="handleSpan" class="cus-table">
-                            <!--上午/下午-->
-                            <template slot-scope="{ row, index }" slot="sub">
-                                <p style="padding:10px 0px 4px 0px;font-size: 20px;">
-                                    {{parseInt(row.time.substr(0,2)) > 12 ? '下午':'上午'}}
-                                </p>
-                            </template>
-                            <!--时段-->
-                            <template slot-scope="{ row, index }" slot="time">
-                                <p style="padding:10px 0px 4px 0px;font-size: 20px;">
-                                    {{row.time}}
-                                </p>
-                                <p style="font-size:12px;padding:4px 0px 10px 0px;">
-                                    {{'('+row.label+')'}}
-                                </p>
-                            </template>
-                            <!--星期一-->
-                            <template slot-scope="{ row, index }" slot="MON">
-                                <div :class="row.weeklies.MON.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.MON.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'MON')" />
-                                        <Icon v-if="row.weeklies.MON.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'MON')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.MON.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.MON.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期二-->
-                            <template slot-scope="{ row, index }" slot="TUE">
-                                <div :class="row.weeklies.TUE.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.TUE.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'TUE')" />
-                                        <Icon v-if="row.weeklies.TUE.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'TUE')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.TUE.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.TUE.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期三-->
-                            <template slot-scope="{ row, index }" slot="WED">
-                                <div :class="row.weeklies.WED.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.WED.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'WED')" />
-                                        <Icon v-if="row.weeklies.WED.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'WED')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.WED.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.WED.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期四-->
-                            <template slot-scope="{ row, index }" slot="THU">
-                                <div :class="row.weeklies.THU.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div class="toggle-status-btn-wrap" v-if="row.weeklies.THU.status == 1">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'THU')" />
-                                        <Icon v-if="row.weeklies.THU.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'THU')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.THU.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.THU.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期五-->
-                            <template slot-scope="{ row, index }" slot="FRI">
-                                <div :class="row.weeklies.FRI.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.FRI.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'FRI')" />
-                                        <Icon v-if="row.weeklies.FRI.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'FRI')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.FRI.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.FRI.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期六-->
-                            <template slot-scope="{ row, index }" slot="SAT">
-                                <div :class="row.weeklies.SAT.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.SAT.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'SAT')" />
-                                        <Icon v-if="row.weeklies.SAT.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'SAT')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.SAT.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.SAT.teacher}}</p>
-                                </div>
-                            </template>
-                            <!--星期日-->
-                            <template slot-scope="{ row, index }" slot="SUN">
-                                <div :class="row.weeklies.SUN.status == 1 ? 'week-day-cell':'week-day-cell vact-status'">
-                                    <div v-if="row.weeklies.SUN.status == 1" class="toggle-status-btn-wrap">
-                                        <Icon class="cell-action-icon" type="ios-settings" title="设置课程" @click="showSetCus(row,'SUN')" />
-                                        <Icon v-if="row.weeklies.SUN.courseName" class="cell-action-icon" type="md-trash" title="取消课程" @click="showCancelCus(row,'SUN')" />
-                                    </div>
-                                    <p class="course-name">{{row.weeklies.SUN.courseName}}</p>
-                                    <p class="teacher-name">{{row.weeklies.SUN.teacher}}</p>
-                                </div>
-                            </template>
-                        </Table>
-                    </div>
+                    <!-- 班级课程表 -->
+                    <ClassTable v-if="this.classListShow[this.curClassIndex]" :schedData="classCus" :classId="classListShow[curClassIndex].id" :periodId="pdId" @selectCell="selectCell" @cancelCell="cancelCell"></ClassTable>
                     <Loading v-if="isLoading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                     <Loading v-if="isLoading" bgColor="rgba(103, 103, 103, 0.27)"></Loading>
                 </vuescroll>
                 </vuescroll>
             </div>
             </div>
         </div>
         </div>
-        <Modal v-model="importCusStatus" title="导入课" width="1000" class-name="dark-iview-modal" @on-ok="confImpStatus = true" @on-cancel="cancelImport">
+        <Modal v-model="importCusStatus" title="导入课表" width="1000" class-name="dark-iview-modal" @on-ok="confImpStatus = true" @on-cancel="cancelImport">
             <ImportExcel ref="impXls" :headerKeys="headerKeys" :headerTitles="headerTitles" @getTableData="getTableData"></ImportExcel>
             <ImportExcel ref="impXls" :headerKeys="headerKeys" :headerTitles="headerTitles" @getTableData="getTableData"></ImportExcel>
             <div class="error-tips-wrap">
             <div class="error-tips-wrap">
                 <span style="color:#ed4014;" v-if="errorCourse.length > 0">
                 <span style="color:#ed4014;" v-if="errorCourse.length > 0">
@@ -168,35 +65,21 @@
                 </span>
                 </span>
             </div>
             </div>
         </Modal>
         </Modal>
-        <Modal v-model="setCusStatus" title="设置课程" class-name="dark-iview-modal dark-iview-form" @on-ok="confirmSetCus" @on-cancel="cancelSetCus">
-            <Form :model="cusItem" :label-width="90">
-                <FormItem label="课程名称">
-                    <Select v-model="cusItem.courseId">
-                        <Option v-for="(item,index) in courseList" :key="index" :value="item.id">{{item.courseName}}</Option>
-                    </Select>
-                </FormItem>
-                <FormItem label="授课老师">
-                    <Select v-model="cusItem.teacher">
-                        <Option v-for="(item,index) in cusTeaList" :key="index" :value="item.id">{{item.name}}</Option>
-                    </Select>
-                </FormItem>
-            </Form>
-        </Modal>
-        <Modal v-model="cancelCusStatus" title="取消课程" class-name="dark-iview-modal dark-iview-form" @on-ok="confirmCancelCus">
-            <p v-if="delCusInfo.row" style="color:white;font-size:16px;">确认取消当前课程?</p>
-        </Modal>
         <Modal v-model="confImpStatus" title="确认导入" class-name="dark-iview-modal dark-iview-form" @on-ok="importCus">
         <Modal v-model="confImpStatus" title="确认导入" class-name="dark-iview-modal dark-iview-form" @on-ok="importCus">
             <p style="color:white;font-size:16px;">批量导入课程将覆盖班级原来的课表,确认批量导入并且覆盖原来的课表?</p>
             <p style="color:white;font-size:16px;">批量导入课程将覆盖班级原来的课表,确认批量导入并且覆盖原来的课表?</p>
         </Modal>
         </Modal>
     </div>
     </div>
 </template>
 </template>
 <script>
 <script>
+import ClassTable from "./ClassTable.vue"
 export default {
 export default {
     components: {
     components: {
+        ClassTable
     },
     },
     inject: ['reload'],
     inject: ['reload'],
     data() {
     data() {
         return {
         return {
+            pdId: '',
             confImpStatus: false,
             confImpStatus: false,
             classFilter: {
             classFilter: {
                 keyWord: ''
                 keyWord: ''
@@ -204,12 +87,6 @@ export default {
             isSearch: false,
             isSearch: false,
             isLoading: false,
             isLoading: false,
             courseList: [],
             courseList: [],
-            cusItem: {
-                courseId: '',
-                teacher: '',
-                row: {},
-                day: ''
-            },
             delCusInfo: {},
             delCusInfo: {},
             errorClass: [],
             errorClass: [],
             errorCourse: [],
             errorCourse: [],
@@ -218,8 +95,6 @@ export default {
             headerKeys: ['classroomCode', 'courseName', 'courseCode', 'teacher', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],
             headerKeys: ['classroomCode', 'courseName', 'courseCode', 'teacher', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'],
             headerTitles: ['班级', '课程名称', '课程编码', '授课老师', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
             headerTitles: ['班级', '课程名称', '课程编码', '授课老师', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日'],
             importCusStatus: false,
             importCusStatus: false,
-            setCusStatus: false,
-            cancelCusStatus: false,
             moreClass: false,
             moreClass: false,
             schoolInfo: {},
             schoolInfo: {},
             subIndex: 0,
             subIndex: 0,
@@ -229,175 +104,72 @@ export default {
             curClassIndex: 0,
             curClassIndex: 0,
             tableData: [],
             tableData: [],
             importData: [],
             importData: [],
-            timeColumns: [
-                {
-                    title: ' ',
-                    slot: 'sub',
-                    width: 100,
-                    align: 'center',
-                    className: 'custom-bg'
-                },
-                {
-                    title: ' ',
-                    slot: 'time',
-                    width: 200,
-                    align: 'center'
-                },
-                {
-                    title: '星期一',
-                    slot: 'MON',
-                    align: 'center'
-                },
-                {
-                    title: '星期二',
-                    slot: 'TUE',
-                    align: 'center'
-                },
-                {
-                    title: '星期三',
-                    slot: 'WED',
-                    align: 'center'
-                },
-                {
-                    title: '星期四',
-                    slot: 'THU',
-                    align: 'center'
-                },
-                {
-                    title: '星期五',
-                    slot: 'FRI',
-                    align: 'center'
-                },
-                {
-                    title: '星期六',
-                    slot: 'SAT',
-                    align: 'center'
-                },
-                {
-                    title: '星期日',
-                    slot: 'SUN',
-                    align: 'center'
-                }
-            ]
+            allClassCus: {}
         }
         }
     },
     },
     methods: {
     methods: {
+        filterByPeriod(pd) {
+            console.log(pd)
+            this.pdId = pd
+            this.curClassIndex = 0
+            if (pd) {
+                this.classListShow = this.classList.filter(item => item.periodId == pd || !item.periodId)
+            } else {
+                this.classListShow = [...this.classList]
+            }
+            // 排序
+            this.classListShow = this.dataSort(this.classListShow)
+        },
+        dataSort(data) {
+            switch (this.orderBy) {
+                case 'id': // ID 排序
+                    data.sort(function (a, b) {
+                        let nameA = a.id.toUpperCase(); // ignore upper and lowercase
+                        let nameB = b.id.toUpperCase(); // ignore upper and lowercase
+                        if (nameA < nameB) {
+                            return -1;
+                        }
+                        if (nameA > nameB) {
+                            return 1;
+                        }
+
+                        // names must be equal
+                        return 0;
+                    })
+                    break;
+                case 'state': // 智慧教室排序
+                    data.sort(function (a, b) {
+                        if (a.style == 'smart') {
+                            return 1
+                        } else {
+                            return -1
+                        }
+                    })
+                    break; // 學生總數排序
+                case 'total':
+                    data.sort(function (a, b) {
+                        return b.studCount - a.studCount;
+                    })
+                    break;
+            }
+            return data
+        },
         // 切换课表模式和课程模式
         // 切换课表模式和课程模式
         toggleView() {
         toggleView() {
             this.$router.push({
             this.$router.push({
                 name: 'NewCusMgt'
                 name: 'NewCusMgt'
             })
             })
         },
         },
-        showCancelCus(row, day) {
-            this.cancelCusStatus = true
-
-            this.delCusInfo.row = row
-            this.delCusInfo.day = day
-        },
-        //确认取消课程
-        confirmCancelCus() {
-            let requestData = {
-                id: this.delCusInfo.row.weeklies[this.delCusInfo.day].courseId,
-                code: this.delCusInfo.row.weeklies[this.delCusInfo.day].teacherCode,
-                classroomCode: this.classListShow[this.curClassIndex].classroomCode,
-                time: this.delCusInfo.row.time,
-                day: this.delCusInfo.day
-            }
-            this.isLoading = true
-            this.$api.courseMgmt.deleteTime(requestData).then(
-                (res) => {
-                    if (!res.error) {
-                        this.$Message.success('取消成功')
-                        this.classListShow[this.curClassIndex].classPlan[this.delCusInfo.row._index].weeklies[this.delCusInfo.day].teacher = undefined
-                        this.classListShow[this.curClassIndex].classPlan[this.delCusInfo.row._index].weeklies[this.delCusInfo.day].teacherCode = undefined
-                        this.classListShow[this.curClassIndex].classPlan[this.delCusInfo.row._index].weeklies[this.delCusInfo.day].courseName = undefined
-                        this.classListShow[this.curClassIndex].classPlan[this.delCusInfo.row._index].weeklies[this.delCusInfo.day].courseId = undefined
-                        let tempArr = JSON.parse(JSON.stringify(this.classListShow[this.curClassIndex].classPlan))
-                        this.classListShow[this.curClassIndex].classPlan = []
-                        this.classListShow[this.curClassIndex].classPlan = [...tempArr]
-                    }
-                    this.isLoading = false
-                },
-                (err) => {
-                    this.$Message.error('取消失败')
-                    this.isLoading = false
-                }
-            )
-        },
         //关键字搜索班级
         //关键字搜索班级
         onSearchClass() {
         onSearchClass() {
             this.classListShow = this.classList.filter((item) => {
             this.classListShow = this.classList.filter((item) => {
-                return item.classroomName.indexOf(this.classFilter.keyWord) !== -1
+                return item.name.indexOf(this.classFilter.keyWord) !== -1
             })
             })
         },
         },
         /**切换搜索状态 */
         /**切换搜索状态 */
         toggleSearch() {
         toggleSearch() {
             this.isSearch = !this.isSearch
             this.isSearch = !this.isSearch
         },
         },
-        //获取课程列表
-        getCourseList() {
-            let requestData = {
-                code: this.$store.state.userInfo.schoolCode
-            }
-            this.$api.courseMgmt.findCourse(requestData).then(
-                (res) => {
-                    if (res.error == null) {
-                        this.courseList = res.result.data
-                    }
-                },
-                (err) => {
-                    this.$Message.error('API error!')
-                }
-            )
-        },
-        //取消设置课程
-        cancelSetCus() {
-            this.cusItem.teacher = ''
-            this.cusItem.courseId = ''
-        },
-        //确认设置课程
-        confirmSetCus() {
-            this.isLoading = true
-            let requestData = {
-                courseId: this.cusItem.courseId,
-                classroomCode: this.classListShow[this.curClassIndex].classroomCode,
-                code: this.cusItem.teacher,
-                courseTime: {
-                    label: this.cusItem.row.label,
-                    time: this.cusItem.row.time,
-                    day: this.cusItem.day
-                }
-            }
-            this.$api.courseMgmt.upsertPlanDto(requestData).then(
-                (res) => {
-                    if (!res.error && res.result.data) {
-                        this.$set(this.classListShow[this.curClassIndex].classPlan[this.cusItem.row._index].weeklies[this.cusItem.day], 'courseName', this.courseList.filter((item) => {
-                            return item.id == this.cusItem.courseId
-                        })[0].courseName)
-
-                        this.$set(this.classListShow[this.curClassIndex].classPlan[this.cusItem.row._index].weeklies[this.cusItem.day], 'teacher', this.cusTeaList.filter((item) => {
-                            return item.id == this.cusItem.teacher
-                        })[0].name)
-
-                        this.$Message.success('设置成功!')
-                        this.cusItem.teacher = ''
-                        this.cusItem.courseId = ''
-                    } else {
-                        this.$Message.error('设置失败!')
-                    }
-                    this.isLoading = false
-                },
-                (err) => {
-                    this.isLoading = false
-                }
-            )
-        },
-        //显示设置课程对话框
-        showSetCus(row, day) {
-            this.cusItem.row = row
-            this.cusItem.day = day
-            this.setCusStatus = true
-        },
         //处理表格导入的数据
         //处理表格导入的数据
         getTableData(data) {
         getTableData(data) {
             this.excelData = data
             this.excelData = data
@@ -468,8 +240,9 @@ export default {
         },
         },
         //显示导入课程
         //显示导入课程
         showImportCus() {
         showImportCus() {
-            this.importCusStatus = true
-            this.moreClass = false
+            // this.importCusStatus = true
+            // this.moreClass = false
+            this.$Message.warning('功能正在开发中')
         },
         },
         //确认导入课程
         //确认导入课程
         importCus() {
         importCus() {
@@ -512,75 +285,26 @@ export default {
         },
         },
         selectClass(index) {
         selectClass(index) {
             this.curClassIndex = index
             this.curClassIndex = index
-            this.isLoading = true
-            if (!this.classListShow[this.curClassIndex].isFull) {
-                this.findClassPlan()
-            } else {
-                setTimeout(() => {
-                    this.isLoading = false
-                }, 500)
-            }
-        },
-        //根据上下午合并单元格
-        handleSpan({ row, column, rowIndex, columnIndex }) {
-            this.getSubIndex()
-            if (rowIndex === 0 && columnIndex === 0) {
-                return [this.subIndex, 1]
-            } else if (rowIndex < this.subIndex && columnIndex === 0) {
-                return [0, 0]
-            }
-            if (rowIndex == this.subIndex && columnIndex === 0) {
-                return [this.schoolInfo.timetable.length - this.subIndex, 1]
-            } else if (rowIndex > this.subIndex && columnIndex === 0) {
-                return [0, 0]
-            }
-        },
-        //计算上下午分割点
-        getSubIndex() {
-            for (let index in this.schoolInfo.timetable) {
-                if (parseInt(this.tableData[index].time.substr(0, 2)) > 12) {
-                    this.subIndex = parseInt(index)
-                    break
-                }
+            let classId = this.classListShow[this.curClassIndex].id
+            if (!this.allClassCus[classId]) {
+                this.isLoading = true
+                this.findClassCus()
             }
             }
         },
         },
+
         //根据班级查询课程安排
         //根据班级查询课程安排
-        findClassPlan() {
+        findClassCus() {
             if (this.classListShow.length > 0) {
             if (this.classListShow.length > 0) {
+                let classId = this.classListShow[this.curClassIndex].id
                 let requestData = {
                 let requestData = {
-                    "classes[*].classroomCode": this.classListShow[this.curClassIndex].classroomCode
+                    id: classId,
+                    code: this.$store.state.userInfo.schoolCode,
+                    scope: 'school'
                 }
                 }
-                this.$api.courseMgmt.findPlan(requestData).then(
+                this.$api.courseMgmt.findCusByClass(requestData).then(
                     (res) => {
                     (res) => {
-                        if (res.error == null) {
-                            let jStr = JSON.stringify(this.tableData)
-                            this.$set(this.classListShow[this.curClassIndex], 'classPlan', JSON.parse(jStr))
-                            for (let planItem of res.result.data) {
-                                let course = this.courseList.filter((item) => {
-                                    return item.id == planItem.id
-                                })
-                                let courseName = course.length > 0 ? course[0].courseName : '无课程名'
-                                let teacher = this.$store.state.teachers.teacherList.filter((item) => {
-                                    return item.id == planItem.code
-                                })
-                                let teacherName = teacher.length > 0 ? teacher[0].name : '无名称'
-                                let realClass = planItem.classes.filter((item) => {
-                                    return item.classroomCode == this.classListShow[this.curClassIndex].classroomCode
-                                })
-                                for (let timeItem of realClass[0].courseTimes) {
-                                    //可优化
-                                    for (let i = 0; i < this.classListShow[this.curClassIndex].classPlan.length; i++) {
-                                        if (timeItem && this.classListShow[this.curClassIndex].classPlan[i].time == timeItem.time) {
-                                            this.classListShow[this.curClassIndex].classPlan[i].weeklies[timeItem.day].teacher = teacherName
-                                            this.classListShow[this.curClassIndex].classPlan[i].weeklies[timeItem.day].teacherCode = planItem.code
-                                            this.classListShow[this.curClassIndex].classPlan[i].weeklies[timeItem.day].courseName = courseName
-                                            this.classListShow[this.curClassIndex].classPlan[i].weeklies[timeItem.day].courseId = planItem.id
-                                            break
-                                        }
-                                    }
-                                }
-                            }
-                            this.classListShow[this.curClassIndex].isFull = true
+                        if (!res.error) {
+                            this.$set(this.allClassCus, classId, res.courses)
                             this.isLoading = false
                             this.isLoading = false
                         } else {
                         } else {
                             this.$Message.error('API error!')
                             this.$Message.error('API error!')
@@ -594,9 +318,96 @@ export default {
             } else {
             } else {
                 this.isLoading = false
                 this.isLoading = false
             }
             }
-        }
+        },
+        //设置课程事件
+        selectCell(data) {
+            //data里面包含当前课程完整信息
+            let course = data.course
+            course.schedule = course.schedule || []
+            let schedule = course.schedule.find(item => {
+                return item.classId == this.classListShow[this.curClassIndex].id && item.teacherId == data.teaId
+            })
+            if (schedule) {
+                schedule.time.push({
+                    week: data.col,
+                    id: data.row.id
+                })
+            } else {
+                schedule = {
+                    classId: this.classListShow[this.curClassIndex].id,
+                    notice: '',
+                    stulist: '',
+                    teacherId: data.teaId,
+                    teacherName: data.teaName,
+                    time: []
+                }
+                schedule.time.push({
+                    week: data.col,
+                    id: data.row.id
+                })
+                course.schedule.push(schedule)
+            }
+            this.updCusInfo(course, 'set')
+        },
+        //取消设置课程
+        cancelCell(data) {
+            let classId = this.classListShow[this.curClassIndex].id
+            let info = data.row.weeklies[data.col]
+            console.log(data)
+            let cus = this.allClassCus[classId].find(item => {
+                return item.id == info.courseId
+            })
+            cus.schedule.forEach(schdItem => {
+                if (schdItem.classId == classId && schdItem.teacherId == info.teacherId) {
+                    schdItem.time.forEach((item, index) => {
+                        if (item.id == data.row.id && item.week == data.col) {
+                            schdItem.time.splice(index, 1)
+                            this.updCusInfo(cus, 'cancel')
+                        }
+                    })
+                }
+            })
+        },
+        // 更新课程数据
+        updCusInfo(course, type) {
+            course.code = course.code.replace('Course-', '')
+            this.$api.courseMgmt.saveOrUpdateCourse({
+                course: course,
+                option: 'update',
+                scope: course.scope || 'school'
+            }).then(
+                res => {
+                    this.$Message.success(this.$t('cusMgt.updateOk'))
+                    let classId = this.classListShow[this.curClassIndex].id
+                    if (type == 'set') {
+                        //更新成功后,更新本地数据,刷新课程表
+                        
+                        this.allClassCus[classId] = this.allClassCus[classId] || []
+                        let isExist = false
+                        this.allClassCus[classId].forEach((item, index) => {
+                            if (item.id == course.id) {
+                                this.allClassCus[classId].splice(index, 1, course)
+                                this.isExist = true
+                            }
+                        })
+                        if (!isExist) {
+                            this.allClassCus[classId].push(course)
+                        }
+                    } else {
+                        this.allClassCus[classId].forEach((item, index) => {
+                            if (item.id == course.id) {
+                                this.allClassCus[classId].splice(index, 1, course)
+                            }
+                        })
+                    }
+
+                }
+            ).catch((e) => {
+                this.$Message.error(this.$t('cusMgt.updateErr'))
+            })
+        },
     },
     },
-    async created() {
+    created() {
         //直接读取登录成功拿到得学校基础信息
         //直接读取登录成功拿到得学校基础信息
         this.$store.dispatch('user/getSchoolProfile').then(
         this.$store.dispatch('user/getSchoolProfile').then(
             res => {
             res => {
@@ -611,34 +422,19 @@ export default {
             err => {
             err => {
                 this.$Message.warning(this.$t('cusMgt.noSchool'))
                 this.$Message.warning(this.$t('cusMgt.noSchool'))
             }
             }
-        )
-        this.getCourseList()
-        await this.$store.dispatch('teachers/getTeacherList')
-        this.findClassPlan()
-    },
-    mounted() {
+        ).finally(() => {
+            this.findClassCus()
+        })
     },
     },
     computed: {
     computed: {
-        cusTeaList() {
-            let curCourse = this.courseList.filter((item) => {
-                return item.id == this.cusItem.courseId
-            })
-            if (curCourse.length > 0) {
-                return this.$store.state.teachers.teacherList.filter((item) => {
-                    return curCourse[0].teachers.indexOf(item.id) !== -1
-                })
+        //当前班级对应的课程数据
+        classCus() {
+            let classId = this.classListShow[this.curClassIndex].id
+            if (classId && this.allClassCus[classId]) {
+                return this.allClassCus[classId]
             } else {
             } else {
                 return []
                 return []
             }
             }
-        },
-        semesterList() {
-            if (this.classListShow.length > 0) {
-                let data = this.$jsFn.getPeriod(this.$store.state.user.schoolProfile.school_base, this.classListShow[this.curClassIndex].periodCode)
-
-                return data
-            } else {
-                return {}
-            }
         }
         }
     }
     }
 }
 }

+ 1 - 28
TEAMModelOS/ClientApp/src/view/newcourse/CourseTime.vue

@@ -215,34 +215,7 @@
                     {
                     {
                         title:'星期日',
                         title:'星期日',
                         slot: 'SUN',
                         slot: 'SUN',
-                        align:'center',
-                        //renderHeader: (h,obj) => {
-                        //    return h(
-                        //        'span',
-                        //        [
-                        //            '星期日',
-                        //            h(
-                        //                'Icon',
-                        //                {
-                        //                    props: {
-                        //                        type: 'ios-settings'
-                        //                    },
-                        //                    style: {
-                        //                        fontSize: '18px', // 改变icon的样式
-                        //                        color: '#559DF9',
-                        //                        cursor: 'pointer'
-                        //                    },
-                        //                    on: {
-                        //                        click: () => {
-                        //                            this.setVactStatus = true
-                        //                            this.weekDay = 'SUN'
-                        //                        }
-                        //                    }
-                        //                }
-                        //            )
-                        //        ]
-                        //    )
-                        //}
+                        align:'center'
                     }
                     }
                 ],
                 ],
                 timeNode: {
                 timeNode: {

+ 1 - 0
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.less

@@ -161,6 +161,7 @@
     }
     }
     .attr-label{
     .attr-label{
         color: #a5a5a5;
         color: #a5a5a5;
+        margin-right: 5px;
     }
     }
     .class-name{
     .class-name{
         font-size: 14px;
         font-size: 14px;

+ 4 - 4
TEAMModelOS/ClientApp/src/view/newcourse/MyCourse.vue

@@ -103,12 +103,12 @@
                                 </span>
                                 </span>
                             </div>
                             </div>
                             <div style="float:right;color:white;" v-if="tabName == 'activity'" class="dark-iview-select">
                             <div style="float:right;color:white;" v-if="tabName == 'activity'" class="dark-iview-select">
-                                <span class="action-btn-wrap" @click="delStudents">
+                                <span class="action-btn-wrap">
                                     {{$t('cusMgt.acType')}}
                                     {{$t('cusMgt.acType')}}
+                                    <Select v-model="curAcType" style="width:160px" size="small">
+                                        <Option v-for="(item,index) in acTypeList" :disabled="index > 2" :value="item.value" :key="item.value">{{ item.label }}</Option>
+                                    </Select>
                                 </span>
                                 </span>
-                                <Select v-model="curAcType" style="width:160px" size="small">
-                                    <Option v-for="(item,index) in acTypeList" :disabled="index > 2" :value="item.value" :key="item.value">{{ item.label }}</Option>
-                                </Select>
                             </div>
                             </div>
                         </div>
                         </div>
                         <!-- 学生名单 -->
                         <!-- 学生名单 -->

+ 4 - 4
TEAMModelOS/ClientApp/src/view/newcourse/NewCusMgt.vue

@@ -1087,10 +1087,10 @@ export default {
         },
         },
         // 切换课表模式和课程模式
         // 切换课表模式和课程模式
         toggleView() {
         toggleView() {
-            // this.$router.push({
-            //     name: 'CoursePlan'
-            // })
-            this.$Message.warning('课表模式开发中...')
+            this.$router.push({
+                name: 'CoursePlan'
+            })
+            // this.$Message.warning('课表模式开发中...')
         },
         },
         dropdownStates(flag) {
         dropdownStates(flag) {
             if (!flag) this.filterByPeriod()
             if (!flag) this.filterByPeriod()

+ 9 - 17
TEAMModelOS/ClientApp/src/view/newcourse/TeaTable.vue

@@ -3,16 +3,6 @@
         <vuescroll>
         <vuescroll>
             <div class="cus-table-top dark-iview-input dark-iview-select">
             <div class="cus-table-top dark-iview-input dark-iview-select">
                 <div class="class-filter-wrap">
                 <div class="class-filter-wrap">
-                    <!-- <span class="label">课程: </span>
-                    <Select v-model="curClass" size="small" style="width: 150px;display:inline-block;margin-right:30px">
-                        <Option v-for="(item,index) in teachClassList" :key="index" :value="item.classroomCode">{{item.classroomName}}</Option>
-                        <Option value="all">所有课程</Option>
-                    </Select> -->
-                    <!-- <span class="label">班级: </span>
-                    <Select v-model="curClass" size="small" style="width: 150px;display:inline-block;">
-                        <Option v-for="(item,index) in teachClassList" :key="index" :value="item.classroomCode">{{item.classroomName}}</Option>
-                        <Option value="all">所有班级</Option>
-                    </Select> -->
                 </div>
                 </div>
             </div>
             </div>
             <Table :columns="timeColumns" disabled-hover :data="timetable" border :span-method="handleSpan" style="width:calc(100% - 15px);margin-top:00px;">
             <Table :columns="timeColumns" disabled-hover :data="timetable" border :span-method="handleSpan" style="width:calc(100% - 15px);margin-top:00px;">
@@ -179,37 +169,37 @@ export default {
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期一',
+                    title: this.$t('cusMgt.mon'),
                     slot: 'MON',
                     slot: 'MON',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期二',
+                    title: this.$t('cusMgt.tue'),
                     slot: 'TUE',
                     slot: 'TUE',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期三',
+                    title: this.$t('cusMgt.wed'),
                     slot: 'WED',
                     slot: 'WED',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期四',
+                    title: this.$t('cusMgt.thu'),
                     slot: 'THU',
                     slot: 'THU',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期五',
+                    title: this.$t('cusMgt.fri'),
                     slot: 'FRI',
                     slot: 'FRI',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期六',
+                    title: this.$t('cusMgt.sat'),
                     slot: 'SAT',
                     slot: 'SAT',
                     align: 'center'
                     align: 'center'
                 },
                 },
                 {
                 {
-                    title: '星期日',
+                    title: this.$t('cusMgt.sun'),
                     slot: 'SUN',
                     slot: 'SUN',
                     align: 'center'
                     align: 'center'
                 }
                 }
@@ -285,6 +275,7 @@ export default {
             let curPrd = this.schoolBase.period.find(item => {
             let curPrd = this.schoolBase.period.find(item => {
                 return item.id == this.periodId
                 return item.id == this.periodId
             })
             })
+            curPrd = curPrd || this.schoolBase.period[0] //没有传pdId就默认第一个
             if (curPrd && curPrd.timetable) {
             if (curPrd && curPrd.timetable) {
                 let timetable = this._.cloneDeep(curPrd.timetable)
                 let timetable = this._.cloneDeep(curPrd.timetable)
                 timetable.forEach(item => {
                 timetable.forEach(item => {
@@ -307,6 +298,7 @@ export default {
                         SAT: {},
                         SAT: {},
                         SUN: {},
                         SUN: {},
                     }
                     }
+                    // 根据课程数据补充课程表
                     this.schedData.forEach(cusItem => {
                     this.schedData.forEach(cusItem => {
                         if (cusItem && cusItem.schedule) {
                         if (cusItem && cusItem.schedule) {
                             cusItem.schedule.forEach((schedItem, sIndex) => {
                             cusItem.schedule.forEach((schedItem, sIndex) => {

+ 36 - 30
TEAMModelOS/ClientApp/src/view/questionnaire/ManageQuestionnaire.vue

@@ -408,42 +408,48 @@
 			/* 获取当前问卷活动学生作答数据 */
 			/* 获取当前问卷活动学生作答数据 */
 			async getSurveyStudents(surveyItem) {
 			async getSurveyStudents(surveyItem) {
 				this.isLoading = true
 				this.isLoading = true
-				let answerdList = await this.getAnswerdRecord(surveyItem)
-				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
-				this.$api.schoolSetting.getClassroomStudent({
-					school_code: this.$store.state.userInfo.schoolCode,
-					ids: surveyItem.classes,
-					scope:surveyItem.owner === this.$store.state.userInfo.schoolCode ? 'school' : 'private'
-				}).then(res => {
-					if (!res.error && res.stus.length) {
-						let list = []
-						res.stus.forEach(classStus => {
-							classStus.forEach(i => {
-								list.push({
-									id: i.id,
-									name: i.name,
-									no: i.no,
-									classroomName: i.className
+				try{
+					let answerdList = await this.getAnswerdRecord(surveyItem)
+					//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
+					this.$api.schoolSetting.getClassroomStudent({
+						school_code: this.$store.state.userInfo.schoolCode,
+						ids: surveyItem.classes,
+						scope:surveyItem.scope
+					}).then(res => {
+						if (!res.error && res.stus.length) {
+							let list = []
+							res.stus.forEach(classStus => {
+								classStus.forEach(i => {
+									list.push({
+										id: i.id,
+										name: i.name,
+										no: i.no,
+										classroomName: i.className
+									})
 								})
 								})
 							})
 							})
-						})
-						this.allSsList = list
-						// 要根据作答情况 结合两张表 处理表格显示的数据 
-						if (answerdList.length) {
-							this.noFinishStudents = this.getNoFinishList(answerdList,list)
+							this.allSsList = list
+							// 要根据作答情况 结合两张表 处理表格显示的数据 
+							if (answerdList.length) {
+								this.noFinishStudents = this.getNoFinishList(answerdList,list)
+							} else {
+								this.noFinishStudents = list
+							}
+							this.isLoading = false
 						} else {
 						} else {
-							this.noFinishStudents = list
+							this.$Message.error(this.$t('vote.getDataFailTip'))
+							this.isLoading = false
 						}
 						}
+					}).catch(err => {
+						console.log(err)
+						this.$Message.error(this.$t('vote.getClassDataFailTip'))
 						this.isLoading = false
 						this.isLoading = false
-					} else {
-						this.$Message.error(this.$t('vote.getDataFailTip'))
-						this.isLoading = false
-					}
-				}).catch(err => {
-					console.log(err)
-					this.$Message.error(this.$t('vote.getClassDataFailTip'))
+					})
+				}catch(e){
+					this.$Message.error(this.$t('vote.getDataFailTip'))
 					this.isLoading = false
 					this.isLoading = false
-				})
+				}
+				
 			},
 			},
 			
 			
 			/* 根据学生ID集合 来换取学生详细数据 */
 			/* 根据学生ID集合 来换取学生详细数据 */

+ 0 - 129
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.css

@@ -1,129 +0,0 @@
-
-.achievement-container {
-    display: flex;
-    flex-direction: column;
-    width: 100%;
-    color: #e4eadb;
-}
-
-    .achievement-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-    .achievement-container .class-info {
-        position:relative;
-        font-size: 14px;
-        font-weight: bold;
-        color: #f1f1f1;
-        margin: 30px 0 10px 60px;
-        display: block;
-    }
-
-        .achievement-container .class-info .ivu-icon {
-            font-size: 26px;
-            color: #0bdfc4;
-            margin-right: 10px;
-        }
-
-        .achievement-container .class-info-back {
-            position:absolute;
-            right:40px;
-            top:0px;
-            color: #0bdfc4;
-            cursor:pointer;
-        }
-
-    .achievement-container .ivu-btn {
-        background: #447a94;
-        border:none;
-    }
-
-    .achievement-container .ivu-divider-horizontal {
-        background:#595959;
-        margin-top:50px;
-        margin-left:50px;
-    }
-
-    .achievement-container .component-percents {
-        display: flex;
-        flex-direction: row;
-        /*justify-content: space-around;*/
-        flex-wrap:wrap;
-		min-height: 160px;
-    }
-
-    .achievement-container .percent-item {
-        width:16%;
-        margin:20px 0;
-        min-width:250px;
-    }
-
-        .achievement-container .percent-item .percent-name {
-            font-size: 16px;
-            text-align: left;
-        }
-        .achievement-container .percent-item .percent-value {
-            font-size:48px;
-            font-weight:200;
-            padding-left:20px;
-            text-align:left;
-        }
-        .achievement-container .percent-item .percent-line {
-            width:3px;
-            height:30px;
-            display:inline-block;
-            background:#ffd800;
-            margin-right:30px;
-        }
-
-    .achievement-container .award-wrap {
-        margin-left:30px;
-        font-size:14px;
-        margin-bottom:10px;
-    }
-
-
-        .achievement-container .award-wrap .ivu-icon {
-            margin-left:40px;
-            margin-right:10px;
-            font-size:26px;
-        }
-
-        .achievement-container .award-class .ivu-divider-horizontal {
-            width: 90%;
-            min-width:90%;
-            margin-left: 5%;
-            margin-top:10px;
-        }
-
-        .achievement-container .award-item .award-class-list {
-            font-size: 28px;
-            font-weight:bold;
-        }
-
-        .achievement-container .award-item .award-class-type {
-            font-size: 14px;
-            font-weight: bold;
-            align-self:flex-start;
-            margin-top:10px;
-        }
-
-
-
-.base-table-row {
-    padding: 20px 100px 20px 80px;
-}
-
-.achievement-table .myTable {
-    height: 400px !important;
-    padding:0;
-}
-
-.fl-col-center {
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-}

+ 108 - 0
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.less

@@ -0,0 +1,108 @@
+.achievement-container {
+  display: flex;
+  flex-direction: column;
+  width: 100%;
+  color: #e4eadb;
+  
+  .class-info {
+    position: relative;
+    font-size: 14px;
+    font-weight: bold;
+    color: #f1f1f1;
+    margin: 30px 0 10px 60px;
+    display: block;
+    .ivu-icon {
+      font-size: 26px;
+      color: #0bdfc4;
+      margin-right: 10px;
+    }
+  }
+  .class-info-back {
+    position: absolute;
+    right: 40px;
+    top: 0px;
+    color: #0bdfc4;
+    cursor: pointer;
+  }
+  .ivu-btn {
+    background: #447a94;
+    border: none;
+  }
+  .ivu-divider-horizontal {
+    background: #595959;
+    margin-top: 50px;
+    margin-left: 50px;
+  }
+  .component-percents {
+    display: flex;
+    flex-direction: row;
+    flex-wrap: wrap;
+    min-height: 160px;
+  }
+  .percent-item {
+    width: 16%;
+    margin: 40px 0;
+    min-width: 250px;
+	padding-right: 40px;
+    .percent-name {
+      font-size: 16px;
+      text-align: left;
+    }
+    .percent-value {
+      font-size: 40px;
+      font-weight: 200;
+      padding-left: 20px;
+      text-align: left;
+    }
+    .percent-line {
+      width: 3px;
+      height: 30px;
+      display: inline-block;
+      background: #ffd800;
+      margin-right: 30px;
+    }
+  }
+  .award-wrap {
+    margin-left: 30px;
+    font-size: 14px;
+    margin-bottom: 10px;
+    .ivu-icon {
+      margin-left: 40px;
+      margin-right: 10px;
+      font-size: 26px;
+    }
+  }
+  .award-class {
+    .ivu-divider-horizontal {
+      width: 90%;
+      min-width: 90%;
+      margin-left: 5%;
+      margin-top: 10px;
+    }
+  }
+  .award-item {
+    .award-class-list {
+      font-size: 28px;
+      font-weight: bold;
+    }
+    .award-class-type {
+      font-size: 14px;
+      font-weight: bold;
+      align-self: flex-start;
+      margin-top: 10px;
+    }
+  }
+}
+
+.achievement-table {
+  .myTable {
+    height: 400px !important;
+    padding: 0;
+  }
+}
+.fl-col-center {
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+}

+ 6 - 35
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/AchievementAnalysis.vue

@@ -14,11 +14,7 @@
                 </div>
                 </div>
             </div>
             </div>
         </Row>
         </Row>
-        <Divider />
 		
 		
-		<!-- 均分分析 -->
-        <Row>
-        </Row>
         <Row>
         <Row>
 			<Col span="12">
 			<Col span="12">
 				<span class="component-title">{{$t('totalAnalysis.ach_title2')}}</span>
 				<span class="component-title">{{$t('totalAnalysis.ach_title2')}}</span>
@@ -29,7 +25,6 @@
 				<BaseEntryBar :echartData="classDatas" echartsId="entryNumberBar"></BaseEntryBar>
 				<BaseEntryBar :echartData="classDatas" echartsId="entryNumberBar"></BaseEntryBar>
 			</Col>
 			</Col>
         </Row>
         </Row>
-        <Divider />
 		
 		
 		<!-- 进线人数统计 -->
 		<!-- 进线人数统计 -->
 <!--        <Row>
 <!--        <Row>
@@ -42,17 +37,16 @@
 		
 		
 		<!-- 进线情况统计 -->
 		<!-- 进线情况统计 -->
         <EntryTables ref="entryTable"></EntryTables>
         <EntryTables ref="entryTable"></EntryTables>
-        <Divider />
 		
 		
 		<!-- 进线率统计 -->
 		<!-- 进线率统计 -->
-        <Row>
+<!--        <Row>
             <span class="component-title">{{$t('totalAnalysis.ach_title6')}}</span>
             <span class="component-title">{{$t('totalAnalysis.ach_title6')}}</span>
         </Row>
         </Row>
         <Row type="flex" justify="space-around" class-name="base-table-row">
         <Row type="flex" justify="space-around" class-name="base-table-row">
             <Col span="24" class-name="achievement-table">
             <Col span="24" class-name="achievement-table">
             <BaseTable :columns="tableColumns" :tableDatas="earlyWarningData" ref="achievementTable" :tableName="$t('totalAnalysis.ach_title6')"  tableRef="achievementTable"></BaseTable>
             <BaseTable :columns="tableColumns" :tableDatas="earlyWarningData" ref="achievementTable" :tableName="$t('totalAnalysis.ach_title6')"  tableRef="achievementTable"></BaseTable>
             </Col>
             </Col>
-        </Row>
+        </Row> -->
 
 
     </div>
     </div>
 </template>
 </template>
@@ -79,31 +73,6 @@
                         title: this.$t('totalAnalysis.base_class'),
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'classId',
                         key: 'classId',
                         renderType: 'renderClassName',
                         renderType: 'renderClassName',
-                        // filters: [
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text14'),
-                        //         value: 3
-                        //     },
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text15'),
-                        //         value: 4
-                        //     },
-                        //     {
-                        //         label: this.$t('totalAnalysis.ach_table_text16'),
-                        //         value: 5
-                        //     }
-
-                        // ],
-                        // filterMultiple: false,
-                        // filterMethod(value, row) {
-                        //     if (value === 1) {
-                        //         return row.changesStatus === 1 && row.changesVal !== 0
-                        //     } else if (value === 2) {
-                        //         return row.changesStatus === -1 && row.changesVal !== 0
-                        //     } else {
-                        //         return row.changesStatus === 0
-                        //     }
-                        // }
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.ach_text7'),
                         title: this.$t('totalAnalysis.ach_text7'),
@@ -207,10 +176,12 @@
 			
 			
 			
 			
 			
 			
+			
+			
         },
         },
         mounted() {
         mounted() {
             this.$parent.dataSelectIndex = 0
             this.$parent.dataSelectIndex = 0
-            this.$refs.achievementTable.$el.childNodes[1].style.borderRight = '0'
+            // this.$refs.achievementTable.$el.childNodes[1].style.borderRight = '0'
 			
 			
 			
 			
 
 
@@ -277,4 +248,4 @@
     }
     }
 </script>
 </script>
 
 
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>

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

@@ -1,6 +1,6 @@
 <template>
 <template>
     <div class="achievement-container">
     <div class="achievement-container">
-        <Row>
+<!--        <Row>
             <span class="class-info">
             <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>
                 <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">
                 <span class="class-info-back">
@@ -9,30 +9,15 @@
                     </Button>
                     </Button>
                 </span>
                 </span>
             </span>
             </span>
-        </Row>
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title7')}}</span>
-        </Row>
-        <Row>
-
-        </Row>
-        <!-- PR排名表格 -->
-        <Row class-name="base-table-row">
-            <BaseTable :columns="earlyPercentColumns"
-                       :tableDatas="tableData"
-                       :tableName="$t('totalAnalysis.ach_title7')"
-                       tableRef="earlyWarningTable"
-                       ref="percentTable"
-                       v-show="warningIndex === 0"
-                       showSelect
-                       @onSelectChange="onSelectChange"></BaseTable>
-        </Row>
+        </Row> -->
+        
+       
         <!-- 班级均分分析 -->
         <!-- 班级均分分析 -->
         <Row class-name="averageBarRow">
         <Row class-name="averageBarRow">
             <span class="component-title">{{$t('totalAnalysis.ach_title8')}}</span>
             <span class="component-title">{{$t('totalAnalysis.ach_title8')}}</span>
             <div class="sort-box">
             <div class="sort-box">
                 <span style="font-size:14px;margin-right:10px;color: #a9a9a9;">{{$t('totalAnalysis.ach_chart_text1')}}:</span>
                 <span style="font-size:14px;margin-right:10px;color: #a9a9a9;">{{$t('totalAnalysis.ach_chart_text1')}}:</span>
-                <Select v-model="sortValue" style="width:160px" @on-change="handleSort">
+                <Select v-model="sortValue" style="width:120px" @on-change="handleSort">
                     <Option v-for="(item,index) in sortArr" :value="index" :label="item" :key="index"></Option>
                     <Option v-for="(item,index) in sortArr" :value="index" :label="item" :key="index"></Option>
                 </Select>
                 </Select>
             </div>
             </div>
@@ -40,6 +25,16 @@
         <Row>
         <Row>
             <div id="stuAverageBar"></div>
             <div id="stuAverageBar"></div>
         </Row>
         </Row>
+		<!-- PR排名表格 -->
+		<Row class-name="base-table-row">
+		    <BaseTable :columns="earlyPercentColumns"
+		               :tableDatas="tableData"
+		               :tableName="$t('totalAnalysis.ach_title7')"
+					   noPage
+		               tableRef="earlyWarningTable"
+		               ref="percentTable"
+		               v-show="warningIndex === 0"></BaseTable>
+		</Row>
     </div>
     </div>
 </template>
 </template>
 
 
@@ -121,6 +116,7 @@
         },
         },
 
 
         created() {
         created() {
+			console.log(this.$route.query)
             this.className = this.$route.query.name
             this.className = this.$route.query.name
         },
         },
 
 
@@ -260,6 +256,7 @@
                         height: 480,
                         height: 480,
                         width: '90%',
                         width: '90%',
                         x2: '5%',
                         x2: '5%',
+						left:'3%',
                         tooltip: {
                         tooltip: {
                             show: true,
                             show: true,
                             trigger: 'axis', // 触发类型
                             trigger: 'axis', // 触发类型
@@ -446,6 +443,19 @@
                 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
                 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
                 this.drawLine(this.tableData)
                 this.drawLine(this.tableData)
             }
             }
+			
+			this.$EventBus.$off('changeClassName')
+			this.$EventBus.$on('changeClassName',val => {
+				 this.className = val
+				 this.tableData = this.onGetClassTable(0)
+				 this.subjectList = this.getAnalysisJson.subjects.map(item => item.name)
+				 this.drawLine(this.tableData)
+			})
+			
+			this.$EventBus.$off('onEarlySubjectChange')
+			this.$EventBus.$on('onEarlySubjectChange',index => {
+				 this.onSelectChange(index)
+			})
         },
         },
 
 
         computed: {
         computed: {
@@ -459,23 +469,13 @@
 				this.tableData = this.onGetClassTable(0)
 				this.tableData = this.onGetClassTable(0)
 				this.subjectList = val.subjects.map(item => item.name)
 				this.subjectList = val.subjects.map(item => item.name)
 				this.drawLine(this.tableData)
 				this.drawLine(this.tableData)
-                // let totalItem = val.rankPR.splice(val.rankPR.length - 1, 1)
-                // let PRData = val.rankPR.unshift(totalItem)
-                // console.log(PRData)
-
-                // let keys = PRData[0].keys
-                // let datas = PRData[0].datas.filter(item => item.hasOwnProperty(this.className))[0]
-                // this.tableData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-                // this.echartData = this.$tools.jsonTransform({ datas: datas, keys: keys })
-                // this.subjectList = val.average.datas.map(item => item.name)
-                // this.drawLine(this.echartData)
             }
             }
 
 
         }
         }
     }
     }
 </script>
 </script>
 
 
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>
 <style scoped>
 <style scoped>
     .early-warning-tab {
     .early-warning-tab {
         margin-left: 60px;
         margin-left: 60px;
@@ -505,7 +505,7 @@
 
 
     .sort-box {
     .sort-box {
         position: absolute;
         position: absolute;
-        right: 150px;
+        right: 50px;
         top: 20px;
         top: 20px;
     }
     }
 </style>
 </style>

+ 31 - 20
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/AchievementAnalysis/EntryTables.vue

@@ -1,8 +1,15 @@
 <template>
 <template>
     <div class="achievement-container">
     <div class="achievement-container">
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title4')}}</span>
-        </Row>
+		<!-- 进线率统计 -->
+		<Row class-name="base-table-row">
+		    <BaseTable :columns="entryRateColumns"
+		               :tableName="$t('totalAnalysis.ach_title5')"
+		               :tableDatas="entryBarData"
+		               tableRef="entryRateTable"
+		               :isScroll="false"
+					   :tableTitle="$t('totalAnalysis.ach_title5')"
+		               ref="rateTable"></BaseTable>
+		</Row>
         <!-- 进线情况统计 -->
         <!-- 进线情况统计 -->
         <Row class-name="base-table-row">
         <Row class-name="base-table-row">
             <BaseTable ref="entryTable"
             <BaseTable ref="entryTable"
@@ -11,19 +18,8 @@
                        :tableDatas="entryTableData"
                        :tableDatas="entryTableData"
                        tableRef="entryTable"
                        tableRef="entryTable"
                        :pageSize="10"
                        :pageSize="10"
-                       :tips="'* 绿色代表进线,蓝色代表踩线'"></BaseTable>
-        </Row>
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ach_title5')}}</span>
-        </Row>
-        <!-- 进线率统计 -->
-        <Row class-name="base-table-row">
-            <BaseTable :columns="entryRateColumns"
-                       :tableName="$t('totalAnalysis.ach_title5')"
-                       :tableDatas="entryBarData"
-                       tableRef="entryRateTable"
-                       :isScroll="false"
-                       ref="rateTable"></BaseTable>
+					   :tableTitle="$t('totalAnalysis.ach_title4')"
+                       :tips="$t('totalAnalysis.myTable.tip')"></BaseTable>
         </Row>
         </Row>
     </div>
     </div>
 </template>
 </template>
@@ -107,7 +103,20 @@
                         renderType: function(h, params) {
                         renderType: function(h, params) {
                             return h('span', params.row.overAverageRate + '%')
                             return h('span', params.row.overAverageRate + '%')
                         }
                         }
-                    }
+                    },
+					{
+					    title: this.$t('totalAnalysis.ach_table_text3'),
+					    key:'average',
+					    renderType: function(h, params) {
+					        return h('span', (Number(params.row.average)).toFixed(2))
+					    },
+					    sortable: 'custom'
+					},
+					{
+					    title: this.$t('totalAnalysis.ach_table_text4'),
+					    key: 'standardDeviation',
+					    sortable: 'custom'
+					},
                 ]
                 ]
             }
             }
         },
         },
@@ -172,9 +181,12 @@
 						entryNum:classItem.lineCount,
 						entryNum:classItem.lineCount,
 						totalNum:classItem.stuCount,
 						totalNum:classItem.stuCount,
 						overAverageRate:classItem.stuCount > 0 ? ((classItem.lineCount / classItem.stuCount) * 100).toFixed(2) : 0.00,
 						overAverageRate:classItem.stuCount > 0 ? ((classItem.lineCount / classItem.stuCount) * 100).toFixed(2) : 0.00,
+						average:classItem.totalAverage,
+						standardDeviation:classItem.standardDeviation.toFixed(2),
 					})
 					})
 				})
 				})
-				let rateRanks = result.sort((a, b) => { return Number(a.overAverageRate) - Number(b.overAverageRate) })
+				/* 根据超均率 来对班级进行年级排名 */
+				let rateRanks = result.sort((a, b) => { return Number(b.average) - Number(a.average) })
 				result.forEach(item => {
 				result.forEach(item => {
 					item.gradeRank = rateRanks.map(i => i.name).indexOf(item.name) + 1
 					item.gradeRank = rateRanks.map(i => i.name).indexOf(item.name) + 1
 				})
 				})
@@ -206,5 +218,4 @@
         }
         }
     }
     }
 </script>
 </script>
-
-<style src="./AchievementAnalysis.css" scoped></style>
+<style src="./AchievementAnalysis.less" lang="less" scoped></style>

+ 16 - 6
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/EvaluationList/TotalIndex.less

@@ -6,11 +6,12 @@
         width: 100%;
         width: 100%;
         padding: 20px;
         padding: 20px;
         margin: 0 auto;
         margin: 0 auto;
+		font-weight: 300;
         /*max-width: 1600px;*/
         /*max-width: 1600px;*/
         user-select: none;
         user-select: none;
 
 
         &-title {
         &-title {
-            font-size: 18px;
+            font-size: 16px;
             font-weight: bold;
             font-weight: bold;
             color: #fff;
             color: #fff;
             position: relative;
             position: relative;
@@ -190,6 +191,8 @@
                 margin: 10px 0;
                 margin: 10px 0;
                 padding: 20px 0;
                 padding: 20px 0;
                 color: #fff;
                 color: #fff;
+				font-size: 12px;
+				font-weight: 300;
                 cursor: pointer;
                 cursor: pointer;
 
 
                 &:hover {
                 &:hover {
@@ -214,7 +217,7 @@
                     }
                     }
 
 
                     .exam-name {
                     .exam-name {
-                        font-size: 22px;
+                        font-size: 18px;
                         margin-right: 10px;
                         margin-right: 10px;
 						vertical-align: text-bottom;
 						vertical-align: text-bottom;
                     }
                     }
@@ -224,6 +227,10 @@
                         padding: 1px 5px;
                         padding: 1px 5px;
                         margin-left: 5px;
                         margin-left: 5px;
                         vertical-align: super;
                         vertical-align: super;
+						
+						&:first-child{
+							margin-left: 0;
+						}
                     }
                     }
                 }
                 }
 
 
@@ -236,7 +243,6 @@
 
 
                     span {
                     span {
                         margin-left: 25px;
                         margin-left: 25px;
-                        font-size: 14px;
                     }
                     }
                 }
                 }
             }
             }
@@ -288,6 +294,7 @@
             margin-top: 20px;
             margin-top: 20px;
             border-radius: 5px;
             border-radius: 5px;
             padding: 20px;
             padding: 20px;
+			font-size: 12px;
             background: #404040;
             background: #404040;
             overflow: hidden;
             overflow: hidden;
 
 
@@ -297,6 +304,10 @@
 
 
             .el-filter-item {
             .el-filter-item {
                 margin-top: 10px;
                 margin-top: 10px;
+				
+				.ivu-radio-wrapper{
+					font-size: 12px !important;
+				}
 
 
                 .el-filter-title {
                 .el-filter-title {
                     font-size: 14px;
                     font-size: 14px;
@@ -337,10 +348,9 @@
         .filter-item {
         .filter-item {
             background: #0087af;
             background: #0087af;
             color: #fff;
             color: #fff;
-            padding: 5px 10px;
+            padding: 2px 5px;
             margin-left: 15px;
             margin-left: 15px;
-            border-radius: 5px;
-            font-size: 12px;
+			font-size: 12px;
         }
         }
 
 
         .filter-item .ivu-icon {
         .filter-item .ivu-icon {

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

@@ -3,208 +3,170 @@
 		<Loading v-show="isLoadingList"></Loading>
 		<Loading v-show="isLoadingList"></Loading>
 		<vuescroll ref="vs">
 		<vuescroll ref="vs">
 			<!--学校名称部分 -->
 			<!--学校名称部分 -->
-			<div class="section school-info">
+			<!-- 			<div class="section school-info">
 				<div class="school-info-box">
 				<div class="school-info-box">
 					<span class="school-info-name">{{ schoolData.name }}{{ $t('totalAnalysis.totalIndex.title') }}</span>
 					<span class="school-info-name">{{ schoolData.name }}{{ $t('totalAnalysis.totalIndex.title') }}</span>
-					<div class="select-grade select-semester">
-						<!-- <Select v-model="selectSemester">
-							<Option v-for="(item, index) in semesterList" :value="index" :key="index">{{ item }}</Option>
-						</Select> -->
-					</div>
 				</div>
 				</div>
-			</div>
+			</div> -->
 			<div class="section">
 			<div class="section">
-				<Tabs :value="tabName">
-					<TabPane :label="$t('totalAnalysis.totalIndex.tab1')" name="tab1">
-						<!-- 评测数据统计部分 -->
-						<div class="section">
-							<div class="section-title">
-								{{ $t("totalAnalysis.ti_title2") }}
-							</div>
-							<div class="section-box">
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text12") }}
-										</div>
-									</div>
+				<!-- 评测数据统计部分 -->
+				<div class="section">
+					<div class="section-title">
+						{{ $t("totalAnalysis.ti_title2") }}
+					</div>
+					<div class="section-box">
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text12") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'regular').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text6") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'regular').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text6") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'simulation').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text7") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'simulation').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text7") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">{{ originList.filter(i => i.type === 'normal').length }}</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text8") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">{{ originList.filter(i => i.type === 'normal').length }}</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text8") }}
 								</div>
 								</div>
-								<div class="exam-data-item block-item">
-									<div class="item-content">
-										<div class="item-num">0</div>
-										<div class="item-name">
-											{{ $t("totalAnalysis.ti_text9") }}
-										</div>
-									</div>
+							</div>
+						</div>
+						<div class="exam-data-item block-item">
+							<div class="item-content">
+								<div class="item-num">0</div>
+								<div class="item-name">
+									{{ $t("totalAnalysis.ti_text9") }}
 								</div>
 								</div>
 							</div>
 							</div>
 						</div>
 						</div>
+					</div>
+				</div>
+				<!-- 评测列表数据部分 -->
+				<div class="section exam-list-wrap">
+					<div class="section-title">
+						{{ $t("totalAnalysis.ti_title5") }}
+						<span class="filter-icon" @click="isShowFilter = !isShowFilter">
+							<Icon type="ios-funnel" />{{$t("totalAnalysis.echarts_text10")}}
+						</span>
+					</div>
 
 
-						<!-- 学科对比统计部分 -->
-						<div class="section">
-							<div class="section-title">
-								{{ $t("totalAnalysis.ti_title3") }}
+					<transition name="indexFade">
+						<div class="el-filter-wrap" v-show="isShowFilter">
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition1") }}:</span>
+								<RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
+									<Radio v-for="(item, index) in schoolData.period" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</div>
 							</div>
-							<div v-if="gradeList.length === 0" style="margin-top: 60px">
-								<EmptyData></EmptyData>
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition2") }}:</span>
+								<RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
+									<Radio label="全部">全部</Radio>
+									<Radio v-for="(item, index) in filterGradeList" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</div>
 							</div>
-							<!-- <Collapse v-model="currentPanel" accordion @on-change="onRadarChange">
-								<Panel v-for="(grade, index) in gradeList" :name="'panel' + index" :key="index" :style="{  marginLeft: index === 0 || index % 4 === 0 ? '0' : '1%', }">
-									<p class="radar-title">{{ grade.Grade }}</p>
-									<BaseGradeRadar :echartsId="'gradeRadar' + index" :echartsData="grade" v-if="grade.subjectName.length > 2"></BaseGradeRadar>
-									<BaseSubjectBar :echartsId="'gradeBar' + index" :echartsData="grade" v-else></BaseSubjectBar>
-									<p class="radar-details">查看班级</p>
-									<div slot="content">
-										<div class="section-box class-radar-box" :style="{ 'margin-left': panelLeft }" v-if="isShowClassRadar">
-											<span class="box-arrow" :style="{ left: arrowLeft }"></span>
-											<div class="radar-data-item block-item" v-for="(item, index2) in grade.className" :key="index2" :style="{ marginLeft:  index2 === 0 || index2 % 5 === 0 ? '0' : '1%',  }">
-												<p class="radar-title">{{ item }}</p>
-												<BaseClassRadar :echartsId="'grade' + index + 'c' + index2" :boxWidth="boxWidth" :echartsData="grade"
-												 :cIndex="index2" v-if="grade.subjectName.length > 2"></BaseClassRadar>
-												<BaseClassBar :echartsId="'grade' + index + 'c' + index2" :boxWidth="boxWidth" :echartsData="grade" :cIndex="index2"
-												 v-else></BaseClassBar>
-											</div>
-										</div>
-									</div>
-								</Panel>
-							</Collapse> -->
-						</div>
-					</TabPane>
-					<TabPane :label="$t('totalAnalysis.totalIndex.tab2')" name="tab2">
-						<!-- 评测列表数据部分 -->
-						<div class="section exam-list-wrap">
-							<div class="section-title">
-								{{ $t("totalAnalysis.ti_title5") }}
-								<span class="filter-icon" @click="isShowFilter = !isShowFilter">
-									<Icon type="ios-funnel" />{{$t("totalAnalysis.echarts_text10")}}
-								</span>
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition7") }}:</span>
+								<RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
+									<Radio label="全部">全部</Radio>
+									<Radio v-for="(item, index) in filterSubjectList" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
 							</div>
 							</div>
-							<transition name="indexFade">
-								<div class="el-filter-wrap" v-show="isShowFilter">
-									<div class="el-filter-item">
-										<span class="el-filter-title">{{ $t("totalAnalysis.condition1") }}:</span>
-										<RadioGroup v-model="filterPeriod" type="button" @on-change="filterPeriodChange">
-
-											<Radio v-for="(item, index) in schoolData.period" :label="item.name" :key="index">{{ item.name }}</Radio>
-										</RadioGroup>
-									</div>
-									<div class="el-filter-item">
-										<span class="el-filter-title">{{ $t("totalAnalysis.condition2") }}:</span>
-										<RadioGroup v-model="filterGrade" type="button" @on-change="filterGradeChange">
-											<Radio label="全部">全部</Radio>
-											<Radio v-for="(item, index) in filterGradeList" :label="item.name" :key="index">{{ item.name }}</Radio>
-										</RadioGroup>
-									</div>
-									<div class="el-filter-item">
-										<span class="el-filter-title">{{ $t("totalAnalysis.condition7") }}:</span>
-										<RadioGroup v-model="filterSubject" type="button" @on-change="filterSubjectChange">
-											<!-- <Radio v-for="(item, index) in filterData.subjectList" :label="item.name" :key="index">{{ item.name }}</Radio> -->
-											<Radio label="全部">全部</Radio>
-											<Radio v-for="(item, index) in filterSubjectList" :label="item.name" :key="index">{{ item.name }}</Radio>
-										</RadioGroup>
-									</div>
-									<div class="el-filter-item">
-										<span class="el-filter-title">{{ $t("totalAnalysis.condition4") }}:</span>
-										<RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
-											<Radio v-for="(item, index) in filterData.typeList" :label="item.name" :key="index">{{ item.name }}</Radio>
-										</RadioGroup>
-									</div>
-									<div class="el-filter-item">
-										<span class="el-filter-title">{{ $t("totalAnalysis.condition3") }}:</span>
-										<RadioGroup v-model="filterTerm" type="button" @on-change="filterTermChange">
-											<Radio v-for="(item, index) in filterData.termList" :label="item.name" :key="index">{{ item.name }}</Radio>
-										</RadioGroup>
-									</div>
-
-									<!-- 考试范围暂未实际有效字段 -->
-									<!-- <div class="el-filter-item">
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition4") }}:</span>
+								<RadioGroup v-model="filterType" type="button" @on-change="filterTypeChange">
+									<Radio v-for="(item, index) in filterData.typeList" :label="item.name" :key="index">{{item.name }}</Radio>
+								</RadioGroup>
+							</div>
+							<div class="el-filter-item">
+								<span class="el-filter-title">{{ $t("totalAnalysis.condition3") }}:</span>
+								<RadioGroup v-model="filterTerm" type="button" @on-change="filterTermChange">
+									<Radio v-for="(item, index) in filterData.termList" :label="item.name" :key="index">{{ item.name }}</Radio>
+								</RadioGroup>
+							</div>
+
+							<!-- 考试范围暂未实际有效字段 -->
+							<!-- <div class="el-filter-item">
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition5") }}:</span>
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition5") }}:</span>
                                         <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
                                         <RadioGroup v-model="filterArea" type="button" @on-change="filterAreaChange">
                                             <Radio v-for="(item, index) in filterData.areaList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                             <Radio v-for="(item, index) in filterData.areaList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                         </RadioGroup>
                                         </RadioGroup>
                                     </div> -->
                                     </div> -->
-									<!-- 评测来源暂未实际有效字段 -->
-									<!-- <div class="el-filter-item">
+							<!-- 评测来源暂未实际有效字段 -->
+							<!-- <div class="el-filter-item">
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition6") }}:</span>
                                         <span class="el-filter-title">{{ $t("totalAnalysis.condition6") }}:</span>
                                         <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
                                         <RadioGroup v-model="filterFeedback" type="button" @on-change="filterFeedbackChange">
                                             <Radio v-for="(item, index) in filterData.feedbackList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                             <Radio v-for="(item, index) in filterData.feedbackList" :label="item.name" :key="index">{{ item.name }}</Radio>
                                         </RadioGroup>
                                         </RadioGroup>
                                     </div> -->
                                     </div> -->
 
 
-								</div>
-							</transition>
-							<div class="el-bread">
-								<!--<Icon type="ios-arrow-forward" />-->
-								<span>{{ $t("totalAnalysis.text5") }}:</span>
-								<span v-if="!hasCondition">{{$t("totalAnalysis.text9")}}</span>
-								<span v-for="(item, index) in filterList" :key="index" class="filter-item" v-if="item.val">{{ item.val }}
-									<Icon type="ios-close" @click="handleRemove(index, item.keyName)" />
-								</span>
-								<span class="list-length">{{ $t("totalAnalysis.text6") }} : {{ examList.length }}
+						</div>
+					</transition>
+					<div class="el-bread">
+						<!--<Icon type="ios-arrow-forward" />-->
+						<span>{{ $t("totalAnalysis.text5") }}:</span>
+						<span v-if="!hasCondition">{{$t("totalAnalysis.text9")}}</span>
+						<span v-for="(item, index) in filterList" :key="index" class="filter-item"
+							v-if="item.val">{{ item.val }}
+							<Icon type="ios-close" @click="handleRemove(index, item.keyName)" />
+						</span>
+						<span class="list-length">{{ $t("totalAnalysis.text6") }} : {{ examList.length }}
+						</span>
+					</div>
+					<div class="section-box list-box">
+						<div v-if="examList.length === 0">
+							<EmptyData></EmptyData>
+						</div>
+						<div class="genius-data-item exam-item" v-else v-for="(item, index) in examList" :key="index"
+							@click="handleChooseExam(item, index)">
+							<div class="exam-info-top">
+								<span class="exam-type">{{ evType[item.type] }}</span>
+								<span class="exam-name">{{ item.name }}</span>
+								<span class="exam-grade">{{ item.period.name}}</span>
+								<span class="exam-grade" v-for="(grade, gradeIndex) in item.grades"
+									:key="gradeIndex">{{ grade.name}}</span>
+								<!-- 评测简要数据API暂未返回学科数据 -->
+								<span class="exam-subjects">
+									<span class="exam-subject" v-for="(subject, index) in item.subjects"
+										:key="index">{{ subject.name }}</span>
 								</span>
 								</span>
 							</div>
 							</div>
-							<div class="section-box list-box">
-								<div v-if="examList.length === 0">
-									<EmptyData></EmptyData>
-								</div>
-								<div class="genius-data-item exam-item" v-else v-for="(item, index) in examList" :key="index" @click="handleChooseExam(item, index)">
-									<div class="exam-info-top">
-										<span class="exam-type">{{ evType[item.type] }}</span>
-										<span class="exam-name">{{ item.name }}</span>
-										<span class="exam-grade">{{ item.period.name}}</span>
-										<span class="exam-grade" v-for="(grade, gradeIndex) in item.grades" :key="gradeIndex">{{ grade.name}}</span>
-										<!-- 评测简要数据API暂未返回学科数据 -->
-										<span class="exam-subjects">
-											<span class="exam-subject" v-for="(subject, index) in item.subjects" :key="index">{{ subject.name }}</span>
-										</span>
-									</div>
-									<div class="exam-info-bottom">
-										<span>{{ $t("totalAnalysis.echarts_text11") }}:
-											{{ $tools.formatTime(item.startTime, "yyyy-MM-dd")  }}</span>
-										<span>{{ $t("totalAnalysis.echarts_text12") }}:
-											{{ item.stuCount }}</span>
-										<span>{{ $t("totalAnalysis.echarts_text13") }}:
-											<!-- 暂无实际参与人数数据 -->
-											{{ item.stuCount }}
-										</span>
-										<span>{{ $t("totalAnalysis.echarts_text14") }}:
-											<!-- 暂无参与率数据 -->
-											{{ getJoinRate(item) }}
-										</span>
-										<!-- <span>{{ $t("totalAnalysis.echarts_text15") }}:
+							<div class="exam-info-bottom">
+								<span>{{ $t("totalAnalysis.echarts_text11") }}:
+									{{ $tools.formatTime(item.startTime, "yyyy-MM-dd")  }}</span>
+								<span>{{ $t("totalAnalysis.echarts_text12") }}:
+									{{ item.stuCount }}</span>
+								<span>{{ $t("totalAnalysis.echarts_text13") }}:
+									<!-- 暂无实际参与人数数据 -->
+									{{ item.stuCount }}
+								</span>
+								<span>{{ $t("totalAnalysis.echarts_text14") }}:
+									<!-- 暂无参与率数据 -->
+									{{ getJoinRate(item) }}
+								</span>
+								<!-- <span>{{ $t("totalAnalysis.echarts_text15") }}:
 										</span> -->
 										</span> -->
-									</div>
-								</div>
-								<Page size="small" />
 							</div>
 							</div>
 						</div>
 						</div>
-					</TabPane>
-				</Tabs>
+						<Page size="small" />
+					</div>
+				</div>
 			</div>
 			</div>
 		</vuescroll>
 		</vuescroll>
 	</div>
 	</div>
@@ -305,8 +267,10 @@
 						if (schoolBaseInfo.period.length) {
 						if (schoolBaseInfo.period.length) {
 							this.filterData.periodList = [this.defaultAll].concat(schoolBaseInfo.period);
 							this.filterData.periodList = [this.defaultAll].concat(schoolBaseInfo.period);
 							this.filterData.gradeList = [this.defaultAll].concat(schoolBaseInfo.period[0].grades);
 							this.filterData.gradeList = [this.defaultAll].concat(schoolBaseInfo.period[0].grades);
-							this.filterData.subjectList = [this.defaultAll].concat(schoolBaseInfo.period[0].subjects);
-							this.filterData.termList = [this.defaultAll].concat(schoolBaseInfo.period[0].semesters);
+							this.filterData.subjectList = [this.defaultAll].concat(schoolBaseInfo.period[0]
+								.subjects);
+							this.filterData.termList = [this.defaultAll].concat(schoolBaseInfo.period[0]
+							.semesters);
 							this.filterData.typeList = filterJson.typeList;
 							this.filterData.typeList = filterJson.typeList;
 							this.filterData.areaList = filterJson.areaList;
 							this.filterData.areaList = filterJson.areaList;
 							this.filterData.feedbackList = filterJson.feedbackList;
 							this.filterData.feedbackList = filterJson.feedbackList;
@@ -343,23 +307,6 @@
 			// 获取评测列表
 			// 获取评测列表
 			getExamList() {
 			getExamList() {
 				this.isLoadingList = true;
 				this.isLoadingList = true;
-				// this.$api.totalAnalysis
-				// 	.getExamList({
-				// 		code: this.$store.state.totalAnalysis.campusCode,
-				// 	})
-				// 	.then((res) => {
-				// 		// api请求
-				// 		this.examList = res.result.data;
-				// 		this.originList = res.result.data;
-				// 		(this.searchList = this.examList.length ?
-				// 			this.examList.map((item) => item.name) : []),
-				// 		this.$store.commit("updateExamList", res.result.data);
-				// 		this.isLoadingList = false;
-				// 	})
-				// 	.catch((err) => {
-				// 		console.log(err);
-				// 		this.isLoadingList = false;
-				// 	});
 				let requestData = {
 				let requestData = {
 					code: this.$store.state.userInfo.schoolCode
 					code: this.$store.state.userInfo.schoolCode
 				}
 				}
@@ -385,44 +332,7 @@
 				)
 				)
 			},
 			},
 
 
-			// 年级雷达图点击
-			onRadarChange(val) {
-				if (!val.length) return;
-				// 根据雷达图位置来决定箭头位置以及展开面板偏移量
-				let num = Number(val[0].split("panel")[1]) + 1;
-				let firstDom = document.getElementsByClassName("ivu-collapse-header")[0];
-				let curItem = document.getElementsByClassName("ivu-collapse-header")[
-					num - 1
-				];
-				this.$nextTick(() => {
-					let domNum = parseInt((num - 1) / 4);
-					let scrollDistance = firstDom.offsetTop + 180 + domNum * 480;
-
-					this.$refs["vs"].scrollTo({
-							y: scrollDistance,
-						},
-						500,
-						"easeInQuad"
-					);
-				});
-
-				this.arrowLeft =
-					num % 4 === 0 ?
-					"87.5%" :
-					(num + 1) % 4 === 0 ?
-					"62.2%" :
-					(num + 2) % 4 === 0 ?
-					"36.5%" :
-					"11.5%";
-				this.panelLeft =
-					num % 4 === 0 ?
-					"-75.8%" :
-					(num + 1) % 4 === 0 ?
-					"-50.5%" :
-					(num + 2) % 4 === 0 ?
-					"-25.2%" :
-					"0";
-			},
+			
 
 
 			handleSearch() {
 			handleSearch() {
 				let that = this;
 				let that = this;
@@ -450,8 +360,8 @@
 				this.filterList.splice(index, 1);
 				this.filterList.splice(index, 1);
 				switch (name) {
 				switch (name) {
 					case "period":
 					case "period":
-						this.filterPeriod = "全部";
-						this.filterConditions.period = null;
+						// this.filterPeriod = "全部";
+						// this.filterConditions.period = null;
 						break;
 						break;
 					case "grade":
 					case "grade":
 						this.filterGrade = "全部";
 						this.filterGrade = "全部";
@@ -487,16 +397,16 @@
 
 
 			filterPeriodChange() {
 			filterPeriodChange() {
 				this.filterConditions.period = this.filterPeriod === "全部" ? null : this.filterPeriod;
 				this.filterConditions.period = this.filterPeriod === "全部" ? null : this.filterPeriod;
-				//切换学科后年级会变化,需要初始化年级状态 默认选中全部
-				// if (this.filterGradeList && this.filterGradeList.length) {
-				//     this.filterGrade = this.filterGradeList[0].name
-				//     this.filterGradeChange()
-				// }
-				//切换学科后学科会变化,需要初始化学科状态 默认选中全部
-				// if (this.filterSubjectList && this.filterSubjectList.length) {
-				//     this.filterSubject = this.filterSubjectList[0].name
-				//     this.filterSubjectChange()
-				// }
+				// 切换学科后年级会变化,需要初始化年级状态 默认选中全部
+				if (this.filterGradeList && this.filterGradeList.length) {
+				    this.filterGrade = "全部"
+				    this.filterGradeChange()
+				}
+				// 切换学科后学科会变化,需要初始化学科状态 默认选中全部
+				if (this.filterSubjectList && this.filterSubjectList.length) {
+				    this.filterSubject = "全部"
+				    this.filterSubjectChange()
+				}
 				this.doFilter();
 				this.doFilter();
 			},
 			},
 			filterGradeChange() {
 			filterGradeChange() {
@@ -513,6 +423,7 @@
 				//评测返回的是key eg:normal,不能直接用中文做过滤条件
 				//评测返回的是key eg:normal,不能直接用中文做过滤条件
 				// this.filterConditions.type =
 				// this.filterConditions.type =
 				//     this.filterType === "全部" ? null : this.filterType;
 				//     this.filterType === "全部" ? null : this.filterType;
+				console.log(this.filterType)
 				if (this.filterType === "全部") {
 				if (this.filterType === "全部") {
 					this.filterConditions.type = null
 					this.filterConditions.type = null
 				} else {
 				} else {
@@ -523,16 +434,7 @@
 				}
 				}
 				this.doFilter();
 				this.doFilter();
 			},
 			},
-			filterAreaChange() {
-				this.filterConditions.area =
-					this.filterArea === "全部" ? null : this.filterArea;
-				this.doFilter();
-			},
-			filterFeedbackChange() {
-				this.filterConditions.feedback =
-					this.filterFeedback === "全部" ? null : this.filterFeedback;
-				this.doFilter();
-			},
+
 			filterSubjectChange() {
 			filterSubjectChange() {
 				this.filterConditions.subject =
 				this.filterConditions.subject =
 					this.filterSubject === "全部" ? null : this.filterSubject;
 					this.filterSubject === "全部" ? null : this.filterSubject;
@@ -542,32 +444,7 @@
 			doFilter() {
 			doFilter() {
 				// 将条件转换成数组便于渲染
 				// 将条件转换成数组便于渲染
 				this.filterList = this.objToArr(this.filterConditions);
 				this.filterList = this.objToArr(this.filterConditions);
-				console.log(this.filterConditions)
-				// 根据条件过滤所有的测验数据
-				// this.examList = this.originList.filter((item) => {
-				//     return (
-				//         item.period.name.indexOf(this.filterConditions.period || "") >
-				//         -1 &&
-				//         item.grades.indexOf(this.filterConditions.grade || "") >
-				//         -1 &&
-				//         item.conditions.semester.indexOf(this.filterConditions.term || "") >
-				//         -1 &&
-				//         item.conditions.type.indexOf(this.filterConditions.type || "") > -1 &&
-				//         item.conditions.range.indexOf(this.filterConditions.area || "") >
-				//         -1 &&
-				//         item.conditions.feedBackType.indexOf(
-				//             this.filterConditions.feedback || ""
-				//         ) > -1 &&
-				//         (this.filterConditions.subject ?
-				//             item.conditions.subject.indexOf(
-				//                 this.filterConditions.subject || ""
-				//             ) > -1 :
-				//             true)
-				//     );
-				// });
-
 				// 根据条件过滤所有的测验数据
 				// 根据条件过滤所有的测验数据
-				console.log('filter', this.filterConditions)
 				this.examList = this.originList.filter((item) => {
 				this.examList = this.originList.filter((item) => {
 					return (
 					return (
 						item.period.name.indexOf(this.filterConditions.period || "") >
 						item.period.name.indexOf(this.filterConditions.period || "") >
@@ -584,10 +461,9 @@
 
 
 			objToArr(obj) {
 			objToArr(obj) {
 				var arr = [];
 				var arr = [];
-				console.log('obj', obj)
 				for (var key in obj) {
 				for (var key in obj) {
 					//处理筛选条件是类型的情况
 					//处理筛选条件是类型的情况
-					if (key == 'type') {
+					if (key == 'type' && obj[key]) {
 						arr.push({
 						arr.push({
 							keyName: key,
 							keyName: key,
 							val: this.filterType,
 							val: this.filterType,
@@ -626,8 +502,8 @@
 			getExamSummary(item) {
 			getExamSummary(item) {
 				return new Promise((r, j) => {
 				return new Promise((r, j) => {
 					this.$api.learnActivity.FindExamInfos({
 					this.$api.learnActivity.FindExamInfos({
-						id:item.id,
-						code:item.code
+						id: item.id,
+						code: item.code
 					}).then(
 					}).then(
 						async res => {
 						async res => {
 								if (!res.error) {
 								if (!res.error) {

+ 1 - 33
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.css

@@ -6,12 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
 
 
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
@@ -20,33 +14,6 @@
     }
     }
 
 
 
 
-.scatter-statistics {
-    margin-top:160px;
-}
-
-.scatter-statistics .ivu-divider-horizontal {
-    margin: 10px 0;
-    width: 80%;
-    margin-left:10%;
-    min-width:unset;
-}
-
-.scatter-statistics .scatter-table-line {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-around;
-    align-items: center;
-    color: #e4eadb;
-    height: 40px;
-    font-size: 14px;
-    /*border-bottom:1px solid #595959;*/
-}
-
-.scatter-statistics .scatter-table-line span {
-    text-align:center;
-    width:100px;
-}
-
 
 
 .pie-to-bar {
 .pie-to-bar {
     position: absolute;
     position: absolute;
@@ -54,6 +21,7 @@
     top: 60px;
     top: 60px;
     color: #d8d8d8;
     color: #d8d8d8;
     cursor:pointer;
     cursor:pointer;
+	z-index: 999;
 }
 }
 
 
 .pie-to-bar .ivu-icon {
 .pie-to-bar .ivu-icon {

+ 3 - 15
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/KnowledgeAnalysis/KnowledgeAnalysis.vue

@@ -15,20 +15,9 @@
 			        <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar>
 			        <BaseKnowledgeRadar echartsId="knowPie2"></BaseKnowledgeRadar>
 			    </Col>
 			    </Col>
 			</Row>
 			</Row>
-			<Divider />
-			<Row>
-			
-			    <span class="component-title">
-			        {{$t('totalAnalysis.ka_title3')}}
-			        <!-- 当前知识块 : 全部 -->
-			        <!--<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">
-			            {{$t('totalAnalysis.ka_text1')}}:{{currentBlock}}
-			            <Icon type="ios-close-circle-outline" @click="refresh" style="cursor:pointer;" v-show="currentBlock != '全部'" />
-			        </span>-->
-			    </span>
+			<Row class-name="base-table-row">
 			    <!-- 得分率关系表 -->
 			    <!-- 得分率关系表 -->
-			    <div style="padding:20px 50px;position:relative">
-			        <!--<span class="btn-class-score" @click="handleGoDetails">查看班级得分<Icon type="ios-arrow-dropright" /></span>-->
+			    <div>
 			        <BaseMyTable :columns="tableColumns"
 			        <BaseMyTable :columns="tableColumns"
 			                     :tableName="$t('totalAnalysis.ka_title3')"
 			                     :tableName="$t('totalAnalysis.ka_title3')"
 			                      tableRef="pointScoreRateTable"
 			                      tableRef="pointScoreRateTable"
@@ -45,12 +34,11 @@
 <script>
 <script>
     import BasePie from '@/components/student-analysis/total/BasePie.vue'
     import BasePie from '@/components/student-analysis/total/BasePie.vue'
     import BaseKnowledgeRadar from '@/components/student-analysis/total/BaseKnowledgeRadar.vue'
     import BaseKnowledgeRadar from '@/components/student-analysis/total/BaseKnowledgeRadar.vue'
-    import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/KnowledgeAnalysis/ScoreDetails.vue'
     export default {
     export default {
         components: {
         components: {
-            BasePie, BaseKnowledgeRadar, BaseMyTable, BaseRadar, ScoreDetails
+            BasePie, BaseKnowledgeRadar, BaseMyTable, ScoreDetails
         },
         },
         data() {
         data() {
             return {
             return {

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

@@ -13,8 +13,8 @@
             </Col>
             </Col>
             <Col span="12">
             <Col span="12">
             <!-- 知识点得分详情 -->
             <!-- 知识点得分详情 -->
-                <span class="component-title">{{$t('totalAnalysis.ka_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span>
-                <div style="padding:0 50px;">
+                <!-- <span class="component-title"><span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text2')}}:{{currentPoint}}</span></span> -->
+                <div>
                     <BaseMyTable :columns="detailsColumns"
                     <BaseMyTable :columns="detailsColumns"
                                  :tableName="$t('totalAnalysis.ka_title5')"
                                  :tableName="$t('totalAnalysis.ka_title5')"
                                   tableRef="pointScoreTable"
                                   tableRef="pointScoreTable"
@@ -24,9 +24,8 @@
             </Col>
             </Col>
         </Row>
         </Row>
         <Divider />
         <Divider />
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ka_title6')}}</span>
-            <div style="padding:20px 50px;">
+        <Row class-name="base-table-row">
+            <div>
                 <BaseMyTable :columns="tableColumns"
                 <BaseMyTable :columns="tableColumns"
                              :tableName="$t('totalAnalysis.ka_title6')"
                              :tableName="$t('totalAnalysis.ka_title6')"
                               tableRef="pointWrongTable"
                               tableRef="pointWrongTable"

+ 1 - 32
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/LevelAnalysis.css

@@ -6,12 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
 
 
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
@@ -20,32 +14,6 @@
     }
     }
 
 
 
 
-.scatter-statistics {
-    margin-top:160px;
-}
-
-.scatter-statistics .ivu-divider-horizontal {
-    margin: 10px 0;
-    width: 80%;
-    margin-left:10%;
-    min-width:unset;
-}
-
-.scatter-statistics .scatter-table-line {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-around;
-    align-items: center;
-    color: #e4eadb;
-    height: 40px;
-    font-size: 14px;
-    /*border-bottom:1px solid #595959;*/
-}
-
-.scatter-statistics .scatter-table-line span {
-    text-align:center;
-    width:100px;
-}
 
 
 
 
 .pie-to-bar {
 .pie-to-bar {
@@ -53,6 +21,7 @@
     right: 80px;
     right: 80px;
     top: 60px;
     top: 60px;
     color: #d8d8d8;
     color: #d8d8d8;
+	z-index: 999;
     cursor:pointer;
     cursor:pointer;
 }
 }
 
 

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

@@ -9,18 +9,11 @@
                 <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar>
                 <BaseLevelRadar echartsId="levelPie2" v-if="isShowPie"></BaseLevelRadar>
             </Col>
             </Col>
         </Row>
         </Row>
-        <Divider />
-        <Row>
-
-            <span class="component-title">
-                {{$t('totalAnalysis.le_title3')}}
-            </span>
-            <div style="padding:20px 50px;position:relative">
+        <Row class-name="base-table-row">
                 <BaseMyTable :columns="tableColumns"
                 <BaseMyTable :columns="tableColumns"
                              :tableName="$t('totalAnalysis.le_title3')"
                              :tableName="$t('totalAnalysis.le_title3')"
                               tableRef="levelScoreRateTable"
                               tableRef="levelScoreRateTable"
                              :tableDatas="levelData"></BaseMyTable>
                              :tableDatas="levelData"></BaseMyTable>
-            </div>
         </Row>
         </Row>
         <Divider />
         <Divider />
         <ScoreDetails ref="detailsRef"></ScoreDetails>
         <ScoreDetails ref="detailsRef"></ScoreDetails>
@@ -30,12 +23,11 @@
 <script>
 <script>
     import BasePie from '@/components/student-analysis/total/BaseLevelPie.vue'
     import BasePie from '@/components/student-analysis/total/BaseLevelPie.vue'
     import BaseLevelRadar from '@/components/student-analysis/total/BaseLevelRadar.vue'
     import BaseLevelRadar from '@/components/student-analysis/total/BaseLevelRadar.vue'
-    import BaseRadar from '@/components/student-analysis/total/BaseRadar.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import BaseMyTable from '@/components/student-analysis/total/BaseMyTable.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'
     import ScoreDetails from '@/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue'
     export default {
     export default {
         components: {
         components: {
-            BasePie, BaseLevelRadar, BaseMyTable, BaseRadar, ScoreDetails
+            BasePie, BaseLevelRadar, BaseMyTable, ScoreDetails
         },
         },
         data() {
         data() {
             return {
             return {

+ 17 - 15
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/LevelAnalysis/ScoreDetails.vue

@@ -4,30 +4,30 @@
 			<Col span="12">
 			<Col span="12">
 			<span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
 			<span class="component-title">{{$t('totalAnalysis.le_title4')}}</span>
 			<span class="pie-to-bar" @click="changeRadarOrBar">
 			<span class="pie-to-bar" @click="changeRadarOrBar">
-				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}</span>
+				<Icon :type="isShowRadar ? 'ios-podium' : 'ios-pie'" />
+				{{isShowRadar?$t('totalAnalysis.ka_chart_text1'):$t('totalAnalysis.ka_chart_text2')}}
+			</span>
 			<div v-show="!isShowRadar">
 			<div v-show="!isShowRadar">
-				<BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick" ref="detailsBar"></BaseDetailBar>
+				<BaseDetailBar echartsId="levelDetailBar" :echartData="levelData" @handleItemClick="handleItemClick"
+					ref="detailsBar"></BaseDetailBar>
 			</div>
 			</div>
 			<div v-if="isShowRadar">
 			<div v-if="isShowRadar">
 				<BaseRadar echartsId="levelRadar"></BaseRadar>
 				<BaseRadar echartsId="levelRadar"></BaseRadar>
 			</div>
 			</div>
 			</Col>
 			</Col>
 			<Col span="12">
 			<Col span="12">
-			<span class="component-title">{{$t('totalAnalysis.le_title5')}}<span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span>
-			<div style="padding:0 50px;">
-				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')" tableRef="levelScoreTable"
-				 :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
+			<!-- <span class="component-title">{{$t('totalAnalysis.le_title5')}}<span
+					style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ka_text3')}}:{{transArr[+currentPoint-1]}}</span></span> -->
+			<div style="padding:30px 100px 0 0">
+				<BaseMyTable :columns="detailsColumns" :tableName="$t('totalAnalysis.le_title5')"
+					tableRef="levelScoreTable" :tableDatas="tableData" ref="detailsTable"></BaseMyTable>
 			</div>
 			</div>
 			</Col>
 			</Col>
 		</Row>
 		</Row>
 		<Divider />
 		<Divider />
-		<Row>
-			<span class="component-title">{{$t('totalAnalysis.le_title6')}}</span>
-			<div style="padding:20px 50px;">
-				<BaseMyTable :columns="tableColumns" :tableName="$t('totalAnalysis.le_title6')" tableRef="levelWrongTable"
-				 :tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
-			</div>
-			<!--<span style="/*font-size:14px;font-weight:bold;margin-left:60px;color:#66cccc*/"></span>-->
+		<Row class-name="base-table-row">
+			<BaseMyTable :columns="tableColumns" :tableName="$t('totalAnalysis.le_title6')" tableRef="levelWrongTable"
+				:tableDatas="numData" ref="numTable" :tips="$t('totalAnalysis.ka_tip1')"></BaseMyTable>
 		</Row>
 		</Row>
 	</div>
 	</div>
 </template>
 </template>
@@ -197,7 +197,8 @@
 		computed: {
 		computed: {
 			// 获取最新散点图数据
 			// 获取最新散点图数据
 			getLevelData() {
 			getLevelData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this
+					.$store.state
 					.totalAnalysis.currentSubject)
 					.totalAnalysis.currentSubject)
 				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
 				let levelJson = this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].levelKey
 				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
 				let transArr = this.$GLOBAL.EXERCISE_LEVELS()
@@ -213,7 +214,8 @@
 			},
 			},
 			// 获取最新散点图数据
 			// 获取最新散点图数据
 			getKnowledgeData() {
 			getKnowledgeData() {
-				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this.$store.state
+				let curSubjectIndex = this.$store.state.totalAnalysis.analysisJson.subjects.map(i => i.name).indexOf(this
+					.$store.state
 					.totalAnalysis.currentSubject)
 					.totalAnalysis.currentSubject)
 				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
 				return this.$store.state.totalAnalysis.analysisJson.pointLevelKey[curSubjectIndex].pointKey
 			}
 			}

+ 1 - 8
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.css

@@ -6,13 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
         margin-top: 50px;
         margin-top: 50px;
@@ -21,7 +14,7 @@
 
 
 
 
 .scatter-statistics {
 .scatter-statistics {
-    margin-top:130px;
+    margin-top:100px;
 }
 }
 
 
 .scatter-statistics .ivu-divider-horizontal {
 .scatter-statistics .ivu-divider-horizontal {

+ 35 - 24
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/ScatterAnalysis/ScatterAnalysis.vue

@@ -4,9 +4,9 @@
             <Col span="12">
             <Col span="12">
             <div class="component-title">
             <div class="component-title">
                 <span>{{$t('totalAnalysis.sca_title1')}}</span>
                 <span>{{$t('totalAnalysis.sca_title1')}}</span>
-                <Select v-model="currentClass" @on-change="onClassSelect">
+<!--                <Select v-model="currentClass" @on-change="onClassSelect">
                     <Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
                     <Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
-                </Select>
+                </Select> -->
             </div>
             </div>
             <BaseScatter :scatterData="tableData"></BaseScatter>
             <BaseScatter :scatterData="tableData"></BaseScatter>
             </Col>
             </Col>
@@ -14,55 +14,58 @@
             <div class="scatter-statistics">
             <div class="scatter-statistics">
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>{{$t('totalAnalysis.sca_text1')}}</span>
                     <span>{{$t('totalAnalysis.sca_text1')}}</span>
-                    <span>{{$t('totalAnalysis.sca_text2')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text2')}}</span>
                     <span>{{$t('totalAnalysis.sca_text3')}}</span>
                     <span>{{$t('totalAnalysis.sca_text3')}}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>A</span>
                     <span>A</span>
-                    <span>{{$t('totalAnalysis.sca_text5')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text5')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'A').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'A').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>A-</span>
-                    <span>{{$t('totalAnalysis.sca_text6')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'A-').length }}</span>
+                    <span>A'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text6')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "A'").length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>B</span>
                     <span>B</span>
-                    <span>{{$t('totalAnalysis.sca_text7')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text7')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'B').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'B').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>B-</span>
-                    <span>{{$t('totalAnalysis.sca_text8')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'B-').length }}</span>
+                    <span>B'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text8')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "B'").length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
                     <span>C</span>
                     <span>C</span>
-                    <span>{{$t('totalAnalysis.sca_text9')}}</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text9')}}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'C').length }}</span>
                     <span>{{ tableData.filter(item => item.scatter === 'C').length }}</span>
                 </div>
                 </div>
                 <Divider />
                 <Divider />
                 <div class="scatter-table-line">
                 <div class="scatter-table-line">
-                    <span>C-</span>
-                    <span>{{$t('totalAnalysis.sca_text10')}}</span>
-                    <span>{{ tableData.filter(item => item.scatter === 'C-').length }}</span>
+                    <span>C'</span>
+                    <span style="text-align: left;width: 250px;">{{$t('totalAnalysis.sca_text10')}}</span>
+                    <span>{{ tableData.filter(item => item.scatter === "C'").length }}</span>
                 </div>
                 </div>
             </div>
             </div>
             </Col>
             </Col>
         </Row>
         </Row>
-        <Divider />
 
 
         <!-- 学生稳定度统计表 -->
         <!-- 学生稳定度统计表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.sca_title2')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="tableColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.sca_title2')" tableRef="scatterTable" ref="scatterTable" ></BaseTable>
+        <Row class-name="base-table-row">
+            <!-- <span class="component-title">{{$t('totalAnalysis.sca_title2')}}</span> -->
+            <div>
+                <BaseTable :columns="tableColumns" 
+				:tableDatas="tableData" 
+				:tableName="$t('totalAnalysis.sca_title2')"
+				 tableRef="scatterTable"
+				  ref="scatterTable" ></BaseTable>
             </div>
             </div>
         </Row>
         </Row>
     </div>
     </div>
@@ -90,6 +93,7 @@
                     {
                     {
                         title: this.$t('totalAnalysis.base_class'),
                         title: this.$t('totalAnalysis.base_class'),
                         key: 'className',
                         key: 'className',
+						sortable:'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
@@ -100,20 +104,20 @@
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.base_score'),
                         title: this.$t('totalAnalysis.base_score'),
-                        sortable: true,
+                        sortable: 'custom',
                         key: 'score',
                         key: 'score',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text1'),
                         title: this.$t('totalAnalysis.sca_table_text1'),
                         key: 'trueNum',
                         key: 'trueNum',
-                        sortable: true,
+                        sortable: 'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text2'),
                         title: this.$t('totalAnalysis.sca_table_text2'),
                         key: 'falseNum',
                         key: 'falseNum',
-                        sortable: true,
+                        sortable: 'custom',
                         minWidth: 100
                         minWidth: 100
                     },
                     },
                     {
                     {
@@ -130,8 +134,10 @@
                     },
                     },
                     {
                     {
                         title: this.$t('totalAnalysis.sca_table_text5'),
                         title: this.$t('totalAnalysis.sca_table_text5'),
-                        key: 'x',
                         sortable: true,
                         sortable: true,
+						renderType: function(h, params) {
+						    return h('span', Number(params.row.x).toFixed(2))
+						},
                         minWidth: 120
                         minWidth: 120
                     },
                     },
                     {
                     {
@@ -208,6 +214,11 @@
 				this.originTableData = JSON.parse(JSON.stringify(this.tableData)) 
 				this.originTableData = JSON.parse(JSON.stringify(this.tableData)) 
 				this.currentClass = 0
 				this.currentClass = 0
 			})
 			})
+			
+			this.$EventBus.$off('changeClassName')
+			this.$EventBus.$on('changeClassName',val => {
+				 this.onClassSelect(this.classList.indexOf(val))
+			})
         },
         },
 
 
         computed: {
         computed: {

+ 1 - 2
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.css

@@ -158,8 +158,7 @@
     right:20px;
     right:20px;
     top:232px; */
     top:232px; */
 	position: sticky;
 	position: sticky;
-	top: 0;
-	background: #fff;
+	top: 10px;
 	color: #333;
 	color: #333;
 }
 }
 
 

+ 69 - 62
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/QuestionList.vue

@@ -12,68 +12,71 @@
 
 
         <!-- 右侧题目列表题型概览 -->
         <!-- 右侧题目列表题型概览 -->
         <div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
         <div class='ql-right-box' ref="rightBox" :style="{width: isOpen ? '17%' : '18%'}">
-            <div class="ql-right-score">
-				<Button type="info" @click="handleBackTo">返回上级</Button>
-				<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> 
-            </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="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)">{{getIndexOrder(item)}} - {{ childIndex + 1 }}</span>
-								</span>
-                            </div>
-                        </div>
-                    </div>
-            </div>
+			<Button type="info" @click="handleBackTo" style="width: 100%;height: 50px;margin-bottom: 15px;border-radius: 0;">返回上级</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> 
+				</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="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)">{{getIndexOrder(item)}} - {{ childIndex + 1 }}</span>
+									</span>
+				                </div>
+				            </div>
+				        </div>
+				</div>
+			</div>
+            
         </div>
         </div>
     </div>
     </div>
 </template>
 </template>
@@ -394,6 +397,10 @@
 					let questionList = this.$refs.exList.$el.getElementsByClassName('exercise-item')
 					let questionList = this.$refs.exList.$el.getElementsByClassName('exercise-item')
 					let itemIndex = this.questionList.indexOf(item)
 					let itemIndex = this.questionList.indexOf(item)
 					let questionDom = questionList[itemIndex]
 					let questionDom = questionList[itemIndex]
+					questionDom.style.border = '3px solid #2db7f5'
+					setTimeout(() => {
+						questionDom.style.border = 'none'
+					},2000)
 					this.doScroll(questionDom.offsetTop)
 					this.doScroll(questionDom.offsetTop)
 					// 伪数组处理统一背景颜色
 					// 伪数组处理统一背景颜色
 					Array.prototype.slice.call(allList).forEach(item => {
 					Array.prototype.slice.call(allList).forEach(item => {

+ 1 - 8
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.css

@@ -6,13 +6,6 @@
     color: #e4eadb;
     color: #e4eadb;
 }
 }
 
 
-    .scatter-container .component-title {
-        font-size: 20px;
-        color: #f1f1f1;
-        margin:30px 0 30px 60px;
-        display:block;
-    }
-
     .scatter-container .ivu-divider-horizontal {
     .scatter-container .ivu-divider-horizontal {
         background: #3e3e3e;
         background: #3e3e3e;
         margin-top: 50px;
         margin-top: 50px;
@@ -21,7 +14,7 @@
 
 
 
 
 .scatter-statistics {
 .scatter-statistics {
-    margin-top:100px;
+    margin-top:70px;
 }
 }
 
 
 .scatter-container .index-wrap {
 .scatter-container .index-wrap {

+ 341 - 342
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/TestAnalysis/TestAnalysis.vue

@@ -1,345 +1,341 @@
 <template>
 <template>
-    <div class="scatter-container">
-        <Row>
-            <Col span="12">
-            <span class="component-title">{{$t('totalAnalysis.ta_title1')}}</span>
-            <BaseTestScatter @handleIndexClick="handleIndexClick" :scatterData="scatterData" :currentIndex="currentExerciseIndex"></BaseTestScatter>
-            </Col>
-            <Col span="12">
-            <div class="scatter-statistics">
-                <div class="scatter-table-line">
-                    <span>{{$t('totalAnalysis.ta_text1')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text2')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text3')}}</span>
-                    <span>{{$t('totalAnalysis.ta_text4')}}</span>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>A</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text6')">{{$t('totalAnalysis.ta_text6')}}</span>
-                    <span>{{A1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>A-</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
-                    <span>{{A2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in A2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>B</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text8')">{{$t('totalAnalysis.ta_text8')}}</span>
-                    <span>{{B1List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B1List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-                <Divider />
-                <div class="scatter-table-line">
-                    <span>B-</span>
-                    <span class="scatter-explain" :title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
-                    <span>{{B2List.length}}</span>
-                    <div class="index-box"><span v-for="(item,index) in B2List" :key="index" class="scatter-exercise-index" @click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span></div>
-                </div>
-            </div>
-            </Col>
-        </Row>
-        <Divider />
-        <!-- 年级单题得分率表 -->
-        <Row>
-            <span class="component-title">
-                <span>{{$t('totalAnalysis.ta_title2')}}</span> 
+	<div class="scatter-container">
+		<Row>
+			<Col span="12">
+			<span class="component-title">{{$t('totalAnalysis.ta_title1')}}</span>
+			<BaseTestScatter @handleIndexClick="handleIndexClick" :scatterData="scatterData"
+				:currentIndex="currentExerciseIndex"></BaseTestScatter>
+			</Col>
+			<Col span="12">
+			<div class="scatter-statistics">
+				<div class="scatter-table-line">
+					<span>{{$t('totalAnalysis.ta_text1')}}</span>
+					<span>{{$t('totalAnalysis.ta_text2')}}</span>
+					<span>{{$t('totalAnalysis.ta_text3')}}</span>
+					<span>{{$t('totalAnalysis.ta_text4')}}</span>
+				</div>
+				<div class="scatter-table-line">
+					<span>A</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text6')">{{$t('totalAnalysis.ta_text6')}}</span>
+					<span>{{A1List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in A1List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>A-</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text7')">{{$t('totalAnalysis.ta_text7')}}</span>
+					<span>{{A2List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in A2List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>B</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text8')">{{$t('totalAnalysis.ta_text8')}}</span>
+					<span>{{B1List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in B1List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+				<Divider />
+				<div class="scatter-table-line">
+					<span>B-</span>
+					<span class="scatter-explain"
+						:title="$t('totalAnalysis.ta_text9')">{{$t('totalAnalysis.ta_text9')}}</span>
+					<span>{{B2List.length}}</span>
+					<div class="index-box"><span v-for="(item,index) in B2List" :key="index"
+							class="scatter-exercise-index"
+							@click="handleIndexClick(item.id)">{{Number(item.id) > 9 ? item.id : '0' + item.id}}</span>
+					</div>
+				</div>
+			</div>
+			</Col>
+		</Row>
+		<Divider />
+		<!-- 年级单题得分率表 -->
+		<Row>
+			<span class="component-title">
+				<span>{{$t('totalAnalysis.ta_title2')}}</span>
 				<div class="index-wrap" style="display: unset">
 				<div class="index-wrap" style="display: unset">
-				    <span v-for="(item,index) in exerciseIndexList"
-				          :key="index"
-						  :title="index"
-				          class="exercise-item-index"
-				          @click="onIndexClick(item)"
-				          :style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
-				    {{+item > 9 ? item : '0' + item}}
-				    </span>
+					<span v-for="(item,index) in exerciseIndexList" :key="index" :title="index"
+						class="exercise-item-index" @click="onIndexClick(item)"
+						:style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
+						{{+item > 9 ? item : '0' + item}}
+					</span>
 				</div>
 				</div>
-                <!-- <Poptip trigger="hover" title="选择题号" placement="right" word-wrap>
-                    <span style="font-size:14px;font-weight:bold;margin-left:20px;color:#66cccc">{{$t('totalAnalysis.ta_text5')}} :{{currentExerciseIndex}}</span>
-                    <div slot="content" class="index-wrap">
-                        <span v-for="(item,index) in exerciseIndexList"
-                              :key="index"
-							  :title="index"
-                              class="exercise-item-index"
-                              @click="onIndexClick(item)"
-                              :style="{background: (+item > 9 ? item : '0' + item) === currentExerciseIndex ? '#d482ab':'#018B99' }">
-                        {{+item > 9 ? item : '0' + item}}
-                        </span>
-                    </div>
-                </Poptip> -->
-            </span>
-            <div>
-                <BaseLineBar :exerciseIndex="currentExerciseIndex" ref="lineBar"></BaseLineBar>
-            </div>
-        </Row>
-        <Divider />
-        <!-- 试题分析总表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ta_title3')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="tableColumns"
-                           :tableDatas="tableData"
-                           :tableName="$t('totalAnalysis.ta_title3')"
-                           tableRef="exerciseAnalsisTable"
-                           ref="analysisTable"
-                           :tips="$t('totalAnalysis.ta_table_tip2')"></BaseTable>
-            </div>
-        </Row>
-        <Divider />
-        <!-- 试题得分率表 -->
-        <Row>
-            <span class="component-title">{{$t('totalAnalysis.ta_title4')}}</span>
-            <div style="padding:20px 50px;">
-                <BaseTable :columns="exerciseColumns"
-                           :tableDatas="tableData"
-                           :tableName="$t('totalAnalysis.ta_title4')"
-                           tableRef="exerciseScoreRateTable"
-                           ref="scoreRateTable"
-                           :tips="$t('totalAnalysis.ta_table_tip1')"></BaseTable>
-            </div>
-        </Row>
-    </div>
+			</span>
+			<div>
+				<BaseLineBar :exerciseIndex="currentExerciseIndex" ref="lineBar"></BaseLineBar>
+			</div>
+		</Row>
+		<!-- 试题分析总表 -->
+		<Row class-name="base-table-row">
+			<BaseTable :columns="tableColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.ta_title3')"
+				tableRef="exerciseAnalsisTable" ref="analysisTable" :tips="$t('totalAnalysis.ta_table_tip2')">
+			</BaseTable>
+		</Row>
+		<!-- 试题得分率表 -->
+		<Row class-name="base-table-row">
+			<BaseTable :columns="exerciseColumns" :tableDatas="tableData" :tableName="$t('totalAnalysis.ta_title4')"
+				tableRef="exerciseScoreRateTable" ref="scoreRateTable" :tips="$t('totalAnalysis.ta_table_tip1')">
+			</BaseTable>
+		</Row>
+	</div>
 </template>
 </template>
 
 
 <script>
 <script>
-    import BaseTestScatter from '@/components/student-analysis/total/BaseTestScatter.vue'
-    import BaseTable from '@/components/student-analysis/total/BaseMyTable.vue'
-    import BaseLineBar from '@/components/student-analysis/total/BaseLineBar.vue'
-    export default {
-        components: {
-            BaseTestScatter, BaseTable, BaseLineBar
-        },
-        data() {
-            return {
-                tableData: [],
-				scatterData:[],
-                exerciseIndexList: [],
-                currentExerciseIndex: 0,
-                A1List: [],
-                A2List: [],
-                B1List: [],
-                B2List: [],
-                tableColumns: [
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text1'),
-                        key: 'id',
-                        width: 100,
-                        renderType: 'renderEventIndex'
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text2'),
-                        key: 'type',
-                        minWidth: 100,
+	import BaseTestScatter from '@/components/student-analysis/total/BaseTestScatter.vue'
+	import BaseTable from '@/components/student-analysis/total/BaseMyTable.vue'
+	import BaseLineBar from '@/components/student-analysis/total/BaseLineBar.vue'
+	export default {
+		components: {
+			BaseTestScatter,
+			BaseTable,
+			BaseLineBar
+		},
+		data() {
+			return {
+				tableData: [],
+				scatterData: [],
+				exerciseIndexList: [],
+				currentExerciseIndex: 0,
+				A1List: [],
+				A2List: [],
+				B1List: [],
+				B2List: [],
+				tableColumns: [{
+						title: this.$t('totalAnalysis.ta_table_text1'),
+						key: 'id',
+						width: 100,
+						renderType: 'renderEventIndex'
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text2'),
+						key: 'type',
+						minWidth: 100,
+						renderType: function(h, params) {
+							return h('span', params.row.type || '暂无')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text3'),
+						key: 'knowledge',
+						minWidth: 150,
+						renderType: function(h, params) {
+							return h('span', params.row.knowledge || '暂无')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.sca_table_text6'),
+						key: 'areaName',
+						minWidth: 100
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text4'),
+						key: 'score',
+						sortable: true,
+						minWidth: 80
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text5'),
+						key: 'diff',
+						sortable: true,
+						minWidth: 100,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.diff) * 100).toFixed(0) + '%')
+						},
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text6'),
+						key: 'identify',
+						renderType: function(h, params) {
+							return h('span', Number(params.row.identify).toFixed(0))
+						},
+						minWidth: 120
+					},
+					{
+						title: 'R1',
+						key: 'R1',
+						sortable: true,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R1) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R2',
+						key: 'R2',
+						sortable: true,
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R2) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R3',
+						sortable: true,
+						key: 'R3',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R3) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R4',
+						sortable: true,
+						key: 'R4',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R4) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R5',
+						sortable: true,
+						key: 'R5',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R5) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					},
+					{
+						title: 'R6',
+						sortable: true,
+						key: 'R6',
+						renderType: function(h, params) {
+							return h('span', (Number(params.row.R6) * 100).toFixed(0) + '%')
+						},
+						minWidth: 100
+					}
+				],
+				exerciseColumns: [{
+						title: this.$t('totalAnalysis.ta_table_text1'),
+						key: 'id',
+						fixed: 'left',
+						width: 100,
+						renderType: 'renderEventIndex'
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text10'),
+						key: 'PH',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', params.row.type || '暂无')
+							return h('span', (Number(params.row.PH) * 100).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text3'),
-                        key: 'knowledge',
-                        minWidth: 150,
+						width: 150
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text11'),
+						key: 'PL',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', params.row.knowledge || '暂无')
+							return h('span', (Number(params.row.PL) * 100).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.sca_table_text6'),
-                        key: 'areaName',
-                        minWidth: 100
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text4'),
-                        key: 'score',
-                        sortable: true,
-                        minWidth: 80
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text5'),
-                        key: 'diff',
-                        sortable: true,
-                        minWidth: 100,
+						width: 150
+					},
+					{
+						title: this.$t('totalAnalysis.ta_table_text8'),
+						key: 'examScoreRate',
+						sortable: true,
 						renderType: function(h, params) {
 						renderType: function(h, params) {
-						    return h('span', (Number(params.row.diff) * 100).toFixed(0) + '%')
+							return h('span', (Number(params.row.examScoreRate)).toFixed(0) + '%')
 						},
 						},
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text6'),
-                        key: 'identify',
-                        renderType: function(h, params) {
-                            return h('span', Number(params.row.identify).toFixed(0))
-                        },
-                        minWidth: 120
-                    },
-                    {
-                        title: 'R1',
-                        key: 'R1',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R1) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R2',
-                        key: 'R2',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R2) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R3',
-                        sortable: true,
-                        key: 'R3',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R3) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R4',
-                        sortable: true,
-                        key: 'R4',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R4) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R5',
-                        sortable: true,
-                        key: 'R5',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R5) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    },
-                    {
-                        title: 'R6',
-                        sortable: true,
-                        key: 'R6',
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.R6) * 100).toFixed(0) + '%')
-                        },
-                        minWidth: 100
-                    }
-                ],
-                exerciseColumns: [
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text1'),
-                        key: 'id',
-                        fixed: 'left',
-                        width: 100,
-                        renderType: 'renderEventIndex'
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text10'),
-                        key: 'PH',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.PH) * 100).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text11'),
-                        key: 'PL',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.PL) * 100).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    {
-                        title: this.$t('totalAnalysis.ta_table_text8'),
-                        key: 'examScoreRate',
-                        sortable: true,
-                        renderType: function(h, params) {
-                            return h('span', (Number(params.row.examScoreRate)).toFixed(0) + '%')
-                        },
-                        width: 150
-                    },
-                    // {
-                    //     title: this.$t('totalAnalysis.ta_table_text9'),
-                    //     key: 'areaScoreRate',
-                    //     sortable: true,
-                    //     renderType: function(h, params) {
-                    //         return h('span', (Number(params.row.areaScoreRate)).toFixed(0) + '%')
-                    //     },
-                    //     width: 150
-                    // }
-                ]
-            }
-        },
-        created() {
-				this.$parent.$parent.$parent.isShowQuestions = false
-        },
+						width: 150
+					},
+					// {
+					//     title: this.$t('totalAnalysis.ta_table_text9'),
+					//     key: 'areaScoreRate',
+					//     sortable: true,
+					//     renderType: function(h, params) {
+					//         return h('span', (Number(params.row.areaScoreRate)).toFixed(0) + '%')
+					//     },
+					//     width: 150
+					// }
+				]
+			}
+		},
+		created() {
+			this.$parent.$parent.$parent.isShowQuestions = false
+		},
 
 
-        methods: {
-            renderClassColumns(classData) {
+		methods: {
+			renderClassColumns(classData) {
 				let classCloumns = []
 				let classCloumns = []
-                // 渲染进线表格的班级数据
-                classData.classes.forEach(item => {
-                    let classColumn = {
-                        title: item.className,
-                        sortable: 'custom',
-                        key: item.className,
-                        render: (h, params) => {
-                            return h('span', (Number(params.row[item.className])).toFixed(0) + '%')
-                        },
-                        minWidth: 150
-                    }
-                    classCloumns.push(classColumn)
-                })
-				
-				this.exerciseColumns.splice(4,this.exerciseColumns.length - 4,...classCloumns)
-            },
+				// 渲染进线表格的班级数据
+				classData.classes.forEach(item => {
+					let classColumn = {
+						title: item.className,
+						sortable: 'custom',
+						key: item.className,
+						render: (h, params) => {
+							return h('span', (Number(params.row[item.className])).toFixed(0) + '%')
+						},
+						minWidth: 150
+					}
+					classCloumns.push(classColumn)
+				})
+
+				this.exerciseColumns.splice(4, this.exerciseColumns.length - 4, ...classCloumns)
+			},
 
 
-            // 点击落点图某个点事件
-            handleItemClick(item) {
-                let index = item.data[item.data.length - 1]
-                this.currentExerciseIndex = index > 9 ? '' + index : '0' + index
+			// 点击落点图某个点事件
+			handleItemClick(item) {
+				let index = item.data[item.data.length - 1]
+				this.currentExerciseIndex = index > 9 ? '' + index : '0' + index
+
+				// 题目编号联动
+				this.$nextTick(() => {
+					let indexDomList = Array.prototype.slice.call(document.getElementsByClassName(
+						'scatter-exercise-index'))
+					let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this
+						.currentExerciseIndex)
+					indexDomList.forEach(item => {
+						item.style.background = 'transparent'
+					})
+					if (hignlightIndexDom.length) {
+						hignlightIndexDom[0].style.background = '#018b99'
+						hignlightIndexDom[0].style.borderRadius = '50%'
+					}
+				})
+			},
+
+			onIndexClick(item) {
+				this.handleItemClick({
+					data: [+item]
+				})
+			},
 
 
-                // 题目编号联动
-                this.$nextTick(() => {
-                    let indexDomList = Array.prototype.slice.call(document.getElementsByClassName('scatter-exercise-index'))
-                    let hignlightIndexDom = indexDomList.filter(item => +item.innerText === +this.currentExerciseIndex)
-                    indexDomList.forEach(item => {
-                        item.style.background = 'transparent'
-                    })
-                    if (hignlightIndexDom.length) {
-                        hignlightIndexDom[0].style.background = '#018b99'
-                        hignlightIndexDom[0].style.borderRadius = '50%'
-                    }
-                })
-            },
+			handleIndexClick(index) {
+				this.$router.push({
+					path: '/total/questionList',
+					query: {
+						QIndex: index
+					}
+				})
+			},
 
 
-            onIndexClick(item) {
-                this.handleItemClick({ data: [+item] })
-            },
 
 
-            handleIndexClick(index) {
-                this.$router.push({ path: '/total/questionList', query: { QIndex: index } })
-            },
-			
-			
 			// 调整图表所需数据结构格式
 			// 调整图表所需数据结构格式
 			renderData(data) {
 			renderData(data) {
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
-				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis
+					.currentSubject)
 				let result = []
 				let result = []
-				analysisJson.paper[curSubjectIndex].Value.forEach((exercise,exerciseIndex) => {
+				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 					let obj = {}
 					let obj = {}
 					analysisJson.paperKey.forEach((key, index) => {
 					analysisJson.paperKey.forEach((key, index) => {
 						obj[key] = exercise[index]
 						obj[key] = exercise[index]
 					})
 					})
-					
+
 					analysisJson.classes.forEach(classItem => {
 					analysisJson.classes.forEach(classItem => {
 						obj[classItem.className] = classItem.subjects[curSubjectIndex].item[exerciseIndex]
 						obj[classItem.className] = classItem.subjects[curSubjectIndex].item[exerciseIndex]
 					})
 					})
@@ -348,8 +344,8 @@
 				console.log(result)
 				console.log(result)
 				return result
 				return result
 			},
 			},
-			
-			doRender(analysisJson){
+
+			doRender(analysisJson) {
 				let exerciseList = this.renderData(analysisJson)
 				let exerciseList = this.renderData(analysisJson)
 				this.renderClassColumns(analysisJson)
 				this.renderClassColumns(analysisJson)
 				this.exerciseIndexList = exerciseList.map(item => item.id)
 				this.exerciseIndexList = exerciseList.map(item => item.id)
@@ -359,12 +355,13 @@
 				this.B2List = exerciseList.filter(item => item.areaName === 'B-')
 				this.B2List = exerciseList.filter(item => item.areaName === 'B-')
 				this.tableData = JSON.parse(JSON.stringify(exerciseList))
 				this.tableData = JSON.parse(JSON.stringify(exerciseList))
 				this.getScatterData()
 				this.getScatterData()
-				console.log('最新试题数据',this.tableData)
+				console.log('最新试题数据', this.tableData)
 			},
 			},
-			
-			getScatterData(){
+
+			getScatterData() {
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
 				let analysisJson = JSON.parse(JSON.stringify(this.getAnalysisJson))
-				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis.currentSubject)
+				let curSubjectIndex = analysisJson.subjects.map(i => i.name).indexOf(this.$store.state.totalAnalysis
+					.currentSubject)
 				let result = []
 				let result = []
 				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 				analysisJson.paper[curSubjectIndex].Value.forEach((exercise, exerciseIndex) => {
 					let obj = {}
 					let obj = {}
@@ -385,37 +382,39 @@
 				})
 				})
 				this.scatterData = newArr
 				this.scatterData = newArr
 			},
 			},
-			
-			getLineBarData(){
-				
+
+			getLineBarData() {
+
 			}
 			}
-        },
+		},
 
 
-        mounted() {
-            this.$refs.analysisTable.$el.childNodes[1].style.borderRight = '0'
-            this.handleItemClick({ data: [1] })
+		mounted() {
+			this.$refs.analysisTable.$el.childNodes[1].style.borderRight = '0'
+			this.handleItemClick({
+				data: [1]
+			})
 			this.getAnalysisJson && this.doRender(this.getAnalysisJson)
 			this.getAnalysisJson && this.doRender(this.getAnalysisJson)
-			
+
 			this.$EventBus.$off('onSubjectChange')
 			this.$EventBus.$off('onSubjectChange')
-			this.$EventBus.$on('onSubjectChange',val => {
+			this.$EventBus.$on('onSubjectChange', val => {
 				this.doRender(this.getAnalysisJson)
 				this.doRender(this.getAnalysisJson)
 				// this.$nextTick(() => {
 				// this.$nextTick(() => {
 				// 	this.$refs.lineBar.renderData(this.getAnalysisJson)
 				// 	this.$refs.lineBar.renderData(this.getAnalysisJson)
 				// })
 				// })
 			})
 			})
-        },
-        computed: {
-            // 获取最新试题分析模块数据
-            getAnalysisJson() {
-                return this.$store.state.totalAnalysis.analysisJson
-            }
-        }
-    }
+		},
+		computed: {
+			// 获取最新试题分析模块数据
+			getAnalysisJson() {
+				return this.$store.state.totalAnalysis.analysisJson
+			}
+		}
+	}
 </script>
 </script>
 
 
 <style src="./TestAnalysis.css" scoped></style>
 <style src="./TestAnalysis.css" scoped></style>
 <style>
 <style>
-    .scatter-container .ivu-poptip-content {
-        max-width:520px;
-    }
+	.scatter-container .ivu-poptip-content {
+		max-width: 520px;
+	}
 </style>
 </style>

+ 37 - 16
TEAMModelOS/ClientApp/src/view/student-analysis/total-analysis/index.less

@@ -99,7 +99,7 @@ body, html, .total-container {
       flex-direction: column;
       flex-direction: column;
       justify-content: center;
       justify-content: center;
       width: 100%;
       width: 100%;
-      height: 130px;
+      height: 110px;
       padding-left: 50px;
       padding-left: 50px;
       margin-left: 30px;
       margin-left: 30px;
       border-bottom: 1px solid #595959;
       border-bottom: 1px solid #595959;
@@ -108,41 +108,40 @@ body, html, .total-container {
 }
 }
 .total-content {
 .total-content {
   .basic-info {
   .basic-info {
+	  font-size: 12px;
     .info-type {
     .info-type {
-      padding: 2px 10px;
+      padding: 1px 5px;
       color: #fbd103;
       color: #fbd103;
       border-radius: 5px;
       border-radius: 5px;
       border: 1px solid #fbd103;
       border: 1px solid #fbd103;
       vertical-align: super;
       vertical-align: super;
     }
     }
     .info-subject {
     .info-subject {
-      padding: 5px 10px;
+      padding: 2px 6px;
       color: #eee;
       color: #eee;
-      border-radius: 5px;
+      border-radius: 3px;
       vertical-align: super;
       vertical-align: super;
       margin-left: 10px;
       margin-left: 10px;
       background: #419901;
       background: #419901;
     }
     }
     .info-grade {
     .info-grade {
-      padding: 5px 10px;
+      padding: 2px 6px;
       color: #eee;
       color: #eee;
-      border-radius: 5px;
+      border-radius: 3px;
       vertical-align: super;
       vertical-align: super;
       margin-left: 10px;
       margin-left: 10px;
       background: #018b99;
       background: #018b99;
     }
     }
     .info-name {
     .info-name {
       color: #fff;
       color: #fff;
-      font-size: 34px;
-      margin-left: 20px;
-      margin-top: 5px;
+      font-size: 22px;
+      margin-left: 10px;
       cursor: pointer;
       cursor: pointer;
     }
     }
     .info-date-person {
     .info-date-person {
       margin-top: 10px;
       margin-top: 10px;
       display: flex;
       display: flex;
       color: #9e9e9e;
       color: #9e9e9e;
-      font-size: 14px;
       .info-item {
       .info-item {
         margin-left: 20px;
         margin-left: 20px;
         &:first-child {
         &:first-child {
@@ -156,10 +155,10 @@ body, html, .total-container {
   }
   }
   .basic-tools {
   .basic-tools {
     position: absolute;
     position: absolute;
-    bottom: 5px;
-    right: 20px;
+    bottom: 8px;
+    right: 40px;
     color: #d1d1d1;
     color: #d1d1d1;
-    font-size: 14px;
+    font-size: 12px;
     .basic-tool-export {
     .basic-tool-export {
       padding: 5px 10px;
       padding: 5px 10px;
       background: none;
       background: none;
@@ -170,7 +169,7 @@ body, html, .total-container {
       margin-bottom: 6px;
       margin-bottom: 6px;
     }
     }
     .ivu-icon {
     .ivu-icon {
-      font-size: 18px;
+      font-size: 14px;
 	  margin-right: 2px;
 	  margin-right: 2px;
       vertical-align: text-bottom;
       vertical-align: text-bottom;
     }
     }
@@ -182,13 +181,13 @@ body, html, .total-container {
     }
     }
   }
   }
   .data-select {
   .data-select {
-    padding: 25px 22px;
+    padding: 25px 0 0 22px;
     color: #9e9e9e;
     color: #9e9e9e;
     font-size: 14px;
     font-size: 14px;
     font-weight: bold;
     font-weight: bold;
     .data-select-active {
     .data-select-active {
       color: #fff;
       color: #fff;
-      border-bottom: 2px solid #fff;
+      border-bottom: 3px solid #42beda;
     }
     }
   }
   }
   .data-select-items {
   .data-select-items {
@@ -210,6 +209,28 @@ body, html, .total-container {
   }
   }
 }
 }
 
 
+.subject-tab{
+	display:inline-block;
+	vertical-align: bottom;
+	margin-bottom: 0;
+	
+	&-item{
+		display: inline-block;
+		margin-right: 20px;
+		padding: 0 8px 2px 8px;
+		cursor: pointer;
+	}
+	&-item-active{
+		border-bottom: 2px solid #fff;
+		color: #fff;
+	}
+}
+
+.class-subject-select{
+	padding: 10px 0 10px 50px;
+	margin-top: 30px;
+}
+
 
 
 .fl-col-center {
 .fl-col-center {
   display: flex;
   display: flex;

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

@@ -1,259 +1,339 @@
 <template>
 <template>
-    <div class="total-container">
-        <div class="total-body">
-            <!-- 评测列表展示组件 -->
-            <!-- 右侧数据展示区域 -->
-            <div class="total-content" ref="dataContainer">
-                <vuescroll ref="vs" @handle-scroll="handleScroll">
-                    <div class="back-to-top fl-col-center" title="返回顶部" v-if="isShowBackToTop" @click="handleBackToTop">
-                        <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>
-					<div class="total-tools-wrap">
+	<div class="total-container">
+		<div class="total-body">
+			<!-- 评测列表展示组件 -->
+			<!-- 右侧数据展示区域 -->
+			<div class="total-content" ref="dataContainer">
+				<vuescroll ref="vs" @handle-scroll="handleScroll">
+					<div class="back-to-top fl-col-center" title="返回顶部" v-if="isShowBackToTop" @click="handleBackToTop">
+						<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>
+
+					<div class="basic-info" v-if="!isShowEvaluations && currentExamItem.name">
+						<p style="display: flex;align-items: center;">
+							<span class="info-type"
+								:style="{color:colorTransfer[currentExamItem.type] || 'red',borderColor:colorTransfer[currentExamItem.type]|| 'red'}">{{nameTransfer[currentExamItem.type]}}</span>
+							<span class="info-name">{{currentExamItem.name}}</span>
+							<span class="info-grade">{{currentExamItem.period.name}}</span>
+							<span class="info-subject" v-for="(subject,index) in currentExamItem.subjects"
+								:key="index">{{subject.name}}</span>
+						</p>
+						<p class="info-date-person">
+							<!--<span class="info-person">{{$t('totalAnalysis.text7')}}:<span style="color:#fff">{{currentExamItem.stuCount}}人</span></span>-->
+							<!--<span class="info-date">{{$t('totalAnalysis.text8')}}:<span style="color:#fff">{{currentExamItem.time || '2019-02-11'}}</span></span>-->
+							<span class="info-item">{{$t('totalAnalysis.echarts_text11')}}: <span
+									style="color:#fff;font-weight:bold">{{ $tools.formatTime(currentExamItem.startTime,'yyyy-MM-dd')}}</span></span>
+							<span class="info-item">{{$t('totalAnalysis.echarts_text12')}}: <span
+									style="color:#fff;font-weight:bold">{{currentExamItem.stuCount}}</span></span>
+							<span class="info-item">{{$t('totalAnalysis.echarts_text13')}}: <span
+									style="color:#fff;font-weight:bold">{{currentExamItem.stuCount || 0}}</span></span>
+							<span class="info-item">{{$t('totalAnalysis.echarts_text14')}}: <span
+									style="color:#fff;font-weight:bold">{{getJoinRate}}</span></span>
+							<span class="info-item">{{$t('totalAnalysis.echarts_text15')}}: <span
+									style="color:#fff;font-weight:bold">{{totalAverage}}</span></span>
+						</p>
 						<div class="basic-tools">
 						<div class="basic-tools">
-						    <span class="basic-tool-export" @click="handleExportTables"><Icon type="md-cloud-download" /> {{$t('totalAnalysis.exportTable')}} </span>
-						    <span class="basic-tool-export" @click="goEvaluationList"> <Icon type="md-exit" /> {{$t('totalAnalysis.goExamList')}} </span>
+							<span class="basic-tool-export" @click="handleExportTables">
+								<Icon type="md-cloud-download" /> {{$t('totalAnalysis.exportTable')}}
+							</span>
+							<span class="basic-tool-export" @click="goEvaluationList">
+								<Icon type="md-exit" /> {{$t('totalAnalysis.goExamList')}}
+							</span>
 						</div>
 						</div>
-					</div>
-                    <div class="basic-info" v-if="!isShowEvaluations && currentExamItem.name">
-                        <p>
-                            <span class="info-type" :style="{color:colorTransfer[currentExamItem.type] || 'red',borderColor:colorTransfer[currentExamItem.type]|| 'red'}">{{nameTransfer[currentExamItem.type]}}</span>
-                            <span class="info-name">{{currentExamItem.name}}</span>
-                            <span class="info-grade">{{currentExamItem.period.name}}</span>
-                            <span class="info-subject" v-for="(subject,index) in currentExamItem.subjects" :key="index">{{subject.name}}</span>
-                        </p>
-                        <p class="info-date-person">
-                            <!--<span class="info-person">{{$t('totalAnalysis.text7')}}:<span style="color:#fff">{{currentExamItem.stuCount}}人</span></span>-->
-                            <!--<span class="info-date">{{$t('totalAnalysis.text8')}}:<span style="color:#fff">{{currentExamItem.time || '2019-02-11'}}</span></span>-->
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text11')}}: <span style="color:#fff;font-weight:bold">{{ $tools.formatTime(currentExamItem.startTime,'yyyy-MM-dd')}}</span></span>
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text12')}}: <span style="color:#fff;font-weight:bold">{{currentExamItem.stuCount}}</span></span>
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text13')}}: <span style="color:#fff;font-weight:bold">{{currentExamItem.stuCount || 0}}</span></span>
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text14')}}: <span style="color:#fff;font-weight:bold">{{getJoinRate}}</span></span>
-                            <span class="info-item">{{$t('totalAnalysis.echarts_text15')}}: <span style="color:#fff;font-weight:bold">{{totalAverage}}</span></span>
-                        </p>
-                        <!-- <div class="basic-tools">
+						<!-- <div class="basic-tools">
                             <span class="basic-tool-export" @click="handleExportTables"> {{$t('totalAnalysis.exportTable')}} <Icon type="md-archive" /></span>
                             <span class="basic-tool-export" @click="handleExportTables"> {{$t('totalAnalysis.exportTable')}} <Icon type="md-archive" /></span>
                             <span class="basic-tool-export" @click="goEvaluationList"> 查看更多评测 <Icon type="md-arrow-round-forward" /></span>
                             <span class="basic-tool-export" @click="goEvaluationList"> 查看更多评测 <Icon type="md-arrow-round-forward" /></span>
                         </div> -->
                         </div> -->
-                    </div>
-                    <div class="data-select" v-if="!isShowQuestions" ref="dataSelect">
-                        <div class="data-select-items" style="display:inline-block">
-                            <span :class="this.$route.path == '/total' || this.$route.path.indexOf('/total/achievement') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('0')">{{$t('totalAnalysis.module1')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/scatter') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('1')">{{$t('totalAnalysis.module2')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/test') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('2')">{{$t('totalAnalysis.module3')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/knowledge') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('3')">{{$t('totalAnalysis.module4')}}</span>
-                            <span :class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''" @click="handleDataSelect('4')">{{$t('totalAnalysis.module5')}}</span>
-                        </div>
-                        <span style="float:right;margin-bottom:4px;" v-if="dataSelectIndex !== '0'">
-                            <span class="select-title">{{$t('totalAnalysis.currentSubject')}}:</span>
-                            <Select v-model="subjectSelectVal" style="width:150px" @on-change="handleSubjectChange">
-                                <Option v-for="(item,index) in getSubjectList" :value="item" :key="index" :label="item"></Option>
-                            </Select>
-                        </span>
-                    </div>
-                    <div class="data-container" style="position:relative" ref="routerView">
-                        <Loading :top="300" v-show="dataLoading"></Loading>
-                        <transition name="fade">
-                            <router-view/>
-                        </transition>
-                    </div>
-                </vuescroll>
-            </div>
-        </div>
-
-        <!-- 导出表格弹窗  -->
-        <Modal v-model="isExportTables" width="660" footer-hide class="export-modal">
-            <ExportTables></ExportTables>
-        </Modal>
-
-    </div>
+					</div>
+					<div class="data-select" v-if="!isShowQuestions" ref="dataSelect">
+						<div class="data-select-items" style="display:inline-block">
+							<span
+								:class="this.$route.path == '/total' || this.$route.path.indexOf('/total/achievement') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('0')">{{$t('totalAnalysis.module1')}}</span>
+							<span :class="this.$route.path.indexOf('/total/scatter') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('1')">{{$t('totalAnalysis.module2')}}</span>
+							<span :class="this.$route.path.indexOf('/total/test') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('2')">{{$t('totalAnalysis.module3')}}</span>
+							<span :class="this.$route.path.indexOf('/total/knowledge') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('3')">{{$t('totalAnalysis.module4')}}</span>
+							<span
+								:class="this.$route.path.indexOf('/total/cognitionLevel') > -1 ? 'data-select-active' : ''"
+								@click="handleDataSelect('4')">{{$t('totalAnalysis.module5')}}</span>
+						</div>
+
+						<div v-if="dataSelectIndex === '0'" class="class-subject-select">
+							<Select v-model="currentClass" @on-change="onClassSelect" class="analysis-select">
+								<Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
+							</Select>
+							<div class="subject-tab" v-if="currentClass !== 0">
+								<span v-for="(subject,subjectIndex) in getSubjectList" :key="subjectIndex" @click="onEarlySubjectChange(subjectIndex)" :class="['subject-tab-item',curWarningSubjectIndex === subjectIndex ? 'subject-tab-item-active' : '']">{{ subject }}</span>
+							</div>
+						</div>
+						
+						<div v-if="dataSelectIndex !== '0'" class="class-subject-select">
+							<Select v-model="currentScatterClass" @on-change="onScatterClassSelect" class="analysis-select" v-if="dataSelectIndex === '1'">
+								<Option v-for="(item,index) in classList" :value="index" :key="item">{{ item }}</Option>
+							</Select>
+							<div class="subject-tab">
+								<span v-for="(subject,subjectIndex) in getSubjectList" :key="subjectIndex" @click="handleSubjectChange(subject)" :class="['subject-tab-item',subjectSelectVal === subject ? 'subject-tab-item-active' : '']">{{ subject }}</span>
+							</div>
+						</div>
+
+						<!-- <span style="float:right;margin-bottom:4px;" v-if="dataSelectIndex !== '0'">
+							<span class="select-title">{{$t('totalAnalysis.currentSubject')}}:</span>
+							<Select v-model="subjectSelectVal" style="width:150px" @on-change="handleSubjectChange">
+								<Option v-for="(item,index) in getSubjectList" :value="item" :key="index" :label="item">
+								</Option>
+							</Select>
+						</span> -->
+					</div>
+					<div class="data-container" style="position:relative" ref="routerView">
+						<Loading :top="300" v-show="dataLoading"></Loading>
+						<transition name="fade">
+							<router-view />
+						</transition>
+					</div>
+				</vuescroll>
+			</div>
+		</div>
+
+		<!-- 导出表格弹窗  -->
+		<Modal v-model="isExportTables" width="660" footer-hide class="export-modal">
+			<ExportTables></ExportTables>
+		</Modal>
+
+	</div>
 </template>
 </template>
 
 
 <script>
 <script>
 	import FileSaver from "file-saver";
 	import FileSaver from "file-saver";
 	import JSZip from "jszip";
 	import JSZip from "jszip";
-    import Loading from '@/common/Loading.vue'
+	import Loading from '@/common/Loading.vue'
 	import excel from '@/utils/excel.js'
 	import excel from '@/utils/excel.js'
-    import '../../../utils/chalk.js'
-    import 'animate.css'
-    import BaseExamList from '@/common/BaseExamList.vue'
-    import ExportTables from '@/components/student-analysis/total/ExportTables.vue'
-    export default {
-        components: {
-            BaseExamList, ExportTables, Loading
-        },
-        data() {
-            return {
-                searchValue: '',
-                contentLoading: false,
-                dataLoading: false,
-                dataSelectIndex: '0',
-                menuIndex: 0,
-                isShowBackToTop: false,
-                isShowQuestions: false,
-                isShowEvaluations: false,
-                isSubMenuShow: false,
-                isExportTables: false,
-                currentExamItem: {},
-                subjectSelectVal: 0,
-                subjectSplitList: [],
-                subjectList: [],
-				examList:[],
-                colorTransfer: {
-                    'regular': '#fbd103',
-                    'simulation': '#baecff',
-                    'normal': '#00ff8a'
-                },
-				nameTransfer:{
+	import '../../../utils/chalk.js'
+	import 'animate.css'
+	import ExportTables from '@/components/student-analysis/total/ExportTables.vue'
+	export default {
+		components: {
+			ExportTables,
+			Loading
+		},
+		data() {
+			return {
+				searchValue: '',
+				contentLoading: false,
+				dataLoading: false,
+				dataSelectIndex: '0',
+				menuIndex: 0,
+				isShowBackToTop: false,
+				isShowQuestions: false,
+				isShowEvaluations: false,
+				isSubMenuShow: false,
+				isExportTables: false,
+				currentExamItem: {},
+				subjectSelectVal: 0,
+				subjectSplitList: [],
+				subjectList: [],
+				examList: [],
+				colorTransfer: {
+					'regular': '#fbd103',
+					'simulation': '#baecff',
+					'normal': '#00ff8a'
+				},
+				nameTransfer: {
 					'regular': '正规考',
 					'regular': '正规考',
 					'simulation': '模拟考',
 					'simulation': '模拟考',
 					'normal': '正常考'
 					'normal': '正常考'
 				},
 				},
-                scrollTopssss: 0,
-				totalAverage:0
-            }
-        },
-        async created() {
-			if(!this.$store.state.totalAnalysis.analysisJson && !localStorage.getItem('curExam')){
-				this.$store.dispatch('getAnalysisJson',{
-					code:this.$route.query.code,
-					id:this.$route.query.id
+				scrollTopssss: 0,
+				totalAverage: 0,
+				currentClass: 0,
+				currentScatterClass:0,
+				curWarningSubjectIndex:0,
+				classList: [],
+			}
+		},
+		async created() {
+			if (!this.$store.state.totalAnalysis.analysisJson && !localStorage.getItem('curExam')) {
+				this.$store.dispatch('getAnalysisJson', {
+					code: this.$route.query.code,
+					id: this.$route.query.id
 				}).then(res => {
 				}).then(res => {
 					console.log('index页面获取JSON')
 					console.log('index页面获取JSON')
 				})
 				})
 			}
 			}
-			
-        },
 
 
-        methods: {
+		},
+
+		methods: {
 			/* 获取当前评测的平均分 */
 			/* 获取当前评测的平均分 */
-			getTotalAverage(data){
+			getTotalAverage(data) {
 				let analysisJson = this.$store.state.totalAnalysis.analysisJson
 				let analysisJson = this.$store.state.totalAnalysis.analysisJson
-				let totalScore = analysisJson.students.reduce(function (total, currentValue, currentIndex, arr) {
-				        return total + currentValue.total;
-				    }, 0);
-					this.totalAverage = (totalScore / analysisJson.students.length).toFixed(2)
+				let totalScore = analysisJson.students.reduce(function(total, currentValue, currentIndex, arr) {
+					return total + currentValue.total;
+				}, 0);
+				this.totalAverage = (totalScore / analysisJson.students.length).toFixed(2)
+			},
+
+			onClassSelect(val) {
+				if (val === 0) {
+					this.$store.commit('updateExportTable', [{
+						tableRef: 'entryTable',
+						tableName: '进线情况统计'
+					}, {
+						tableRef: 'entryRateTable',
+						tableName: '进线率统计'
+					}, {
+						tableRef: 'achievementTable',
+						tableName: '预警统计表格'
+					}])
+					this.$router.push({
+						path: '/total'
+					})
+				} else {
+					this.curWarningSubjectIndex = 0
+					this.$store.commit('updateExportTable', [{
+						tableRef: 'earlyWarningTable',
+						tableName: this.$t('totalAnalysis.myTable.rank')
+					}])
+					if(this.$route.path === '/total/achievement/earlyWarning'){
+						this.$EventBus.$emit('changeClassName',this.classList[val])
+					}else{
+						this.$router.push({
+							path: '/total/achievement/earlyWarning',
+							query: {
+								name: this.classList[val]
+							}
+						})
+					}
+				}
 			},
 			},
 			
 			
-            // 选择查看模块
-            handleDataSelect(index) {
-                let path = ''
-                let that = this
-                this.dataSelectIndex = index + ''
-                this.dataLoading = true
-                switch (Number(index)) {
-                    case 0:
-                        path = '/total'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'entryTable',
-                            tableName:'进线情况统计'
-                        },{
-                            tableRef: 'entryRateTable',
-                            tableName:'进线率统计'
-                        },{
-                            tableRef: 'achievementTable',
-                            tableName:'预警统计表格'
-                        }])
-
-                        break
-                    case 1:
-                        path = '/total/scatter'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'scatterTable',
-                            tableName:'学生稳定度统计表'
-                        }])
-                        break
-                    case 2:
-                        path = '/total/test'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'exerciseAnalsisTable',
-                            tableName:'试题分析总表'
-                        },{
-                            tableRef: 'exerciseScoreRateTable',
-                            tableName:'试题得分率表'
-                        }])
-                        break
-                    case 3:
-                        path = '/total/knowledge'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'pointScoreRateTable',
-                            tableName:'知识点得分率关系表'
-                        },{
-                            tableRef: 'pointScoreTable',
-                            tableName:'知识点得分详情表'
-                        },{
-                            tableRef: 'pointWrongTable',
-                            tableName:'知识点错题率关系表'
-                        }])
-                        break
-                    case 4:
-                        path = '/total/cognitionLevel'
-                        this.$store.commit('updateExportTable', [{
-                            tableRef: 'levelScoreRateTable',
-                            tableName:'认知层次得分率关系表'
-                        },{
-                            tableRef: 'levelScoreTable',
-                            tableName:'认知层次得分详情表'
-                        },{
-                            tableRef: 'levelWrongTable',
-                            tableName:'认知层次错题率关系表'
-                        }])
-                        break
-                    default:
-                        break
-                }
+			onScatterClassSelect(val){
+				this.$EventBus.$emit('changeClassName',this.classList[val])
+			},
+
+			// 选择查看模块
+			handleDataSelect(index) {
+				let path = ''
+				let that = this
+				this.dataSelectIndex = index + ''
+				this.dataLoading = true
+				switch (Number(index)) {
+					case 0:
+						path = '/total'
+						this.currentClass = 0
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'entryTable',
+							tableName: '进线情况统计'
+						}, {
+							tableRef: 'entryRateTable',
+							tableName: '进线率统计'
+						}])
+
+						break
+					case 1:
+						path = '/total/scatter'
+						this.currentScatterClass = 0
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'scatterTable',
+							tableName: '学生稳定度统计表'
+						}])
+						break
+					case 2:
+						path = '/total/test'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'exerciseAnalsisTable',
+							tableName: '试题分析总表'
+						}, {
+							tableRef: 'exerciseScoreRateTable',
+							tableName: '试题得分率表'
+						}])
+						break
+					case 3:
+						path = '/total/knowledge'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'pointScoreRateTable',
+							tableName: '知识点得分率关系表'
+						}, {
+							tableRef: 'pointScoreTable',
+							tableName: '知识点得分详情表'
+						}, {
+							tableRef: 'pointWrongTable',
+							tableName: '知识点错题率关系表'
+						}])
+						break
+					case 4:
+						path = '/total/cognitionLevel'
+						this.$store.commit('updateExportTable', [{
+							tableRef: 'levelScoreRateTable',
+							tableName: '认知层次得分率关系表'
+						}, {
+							tableRef: 'levelScoreTable',
+							tableName: '认知层次得分详情表'
+						}, {
+							tableRef: 'levelWrongTable',
+							tableName: '认知层次错题率关系表'
+						}])
+						break
+					default:
+						break
+				}
 				that.dataLoading = false
 				that.dataLoading = false
-                this.$router.push(path)
-            },
-			
+				this.$router.push(path)
+			},
+
 			// 查看更多评测列表
 			// 查看更多评测列表
 			goEvaluationList() {
 			goEvaluationList() {
-				this.$store.commit('clearAnalysis',null)
+				this.$store.commit('clearAnalysis', null)
 				this.$router.push({
 				this.$router.push({
-					name: 'totalIndex',
-					params: {
-						tabName: 'tab2'
-					}
+					name: 'totalIndex'
 				})
 				})
 			},
 			},
 
 
-            // 导出表格操作
-            handleExportTables() {
-                this.isExportTables = true
-            },
-
-            // 返回顶部
-            handleBackToTop() {
-                this.$refs['vs'].scrollTo(
-                    {
-                        y: '0'
-                    },
-                    500
-                )
-            },
-
-            // 切换科目时更换页面图表数据
-            handleSubjectChange(val) {
-                let that = this
-                // this.dataLoading = true
-				console.log('API===========================' + val)
-                this.$store.commit('updateCurSubject', val)
-				this.$EventBus.$emit('onSubjectChange',val)
-                
-            },
-
-            // 判断容器滚动距离
-            handleScroll(vertical, horizontal, nativeEvent) {
-                this.isShowBackToTop = vertical.scrollTop > 400
-                this.scrollTopssss = vertical.scrollTop
-                this.$store.commit('updateScrollTop', vertical.scrollTop)
-            },
+			// 导出表格操作
+			handleExportTables() {
+				this.isExportTables = true
+			},
+
+			// 返回顶部
+			handleBackToTop() {
+				this.$refs['vs'].scrollTo({
+						y: '0'
+					},
+					500
+				)
+			},
 			
 			
+			onEarlySubjectChange(index){
+				this.$EventBus.$emit('onEarlySubjectChange', index)
+				this.curWarningSubjectIndex = index
+			},
+
+			// 切换科目时更换页面图表数据
+			handleSubjectChange(val) {
+				console.log(val)
+				let that = this
+				// this.dataLoading = true
+				console.log('API===========================' + val)
+				this.$store.commit('updateCurSubject', val)
+				this.$EventBus.$emit('onSubjectChange', val)
+
+			},
+
+			// 判断容器滚动距离
+			handleScroll(vertical, horizontal, nativeEvent) {
+				this.isShowBackToTop = vertical.scrollTop > 400
+				this.scrollTopssss = vertical.scrollTop
+				this.$store.commit('updateScrollTop', vertical.scrollTop)
+			},
+
 			// 多选文件下载
 			// 多选文件下载
-			onMultipleDownLoad(val){
+			onMultipleDownLoad(val) {
 				let excelNums = this.$store.state.totalAnalysis.excelNums
 				let excelNums = this.$store.state.totalAnalysis.excelNums
-				if(val.length === excelNums){
+				if (val.length === excelNums) {
 					// 如果下载数据已全部获取到 则执行下载程序
 					// 如果下载数据已全部获取到 则执行下载程序
 					const zip = new JSZip();
 					const zip = new JSZip();
 					let promiseArr = []
 					let promiseArr = []
@@ -264,24 +344,30 @@
 					Promise.all(promiseArr).then(result => {
 					Promise.all(promiseArr).then(result => {
 						console.log(result)
 						console.log(result)
 						result.forEach(file => {
 						result.forEach(file => {
-							zip.file(file.name,file, { binary: true }); // 逐个添加文件
+							zip.file(file.name, file, {
+								binary: true
+							}); // 逐个添加文件
 						})
 						})
-						zip.generateAsync({ type: "blob" }).then(content => {
-						    // 生成二进制流
-						    FileSaver.saveAs(content, `${ result[0].name.split('.xlsx')[0] }等${ result.length} 个表格.zip`); // 利用file-saver保存文件
-						    this.isLoading = false;
+						zip.generateAsync({
+							type: "blob"
+						}).then(content => {
+							// 生成二进制流
+							FileSaver.saveAs(content,
+								`${ result[0].name.split('.xlsx')[0] }等${ result.length} 个表格.zip`
+								); // 利用file-saver保存文件
+							this.isLoading = false;
 						})
 						})
 					})
 					})
-					
+
 				}
 				}
 			},
 			},
 
 
-        },
-        mounted() {
+		},
+		mounted() {
 			let downLoadExcels = []
 			let downLoadExcels = []
-            let examIndex = this.$route.query.index
-			this.$nextTick(()=> {
-				if(this.$route.name !== 'earlyWarning'){
+			let examIndex = this.$route.query.index
+			this.$nextTick(() => {
+				if (this.$route.name !== 'earlyWarning') {
 					// this.getExamData(examIndex)
 					// this.getExamData(examIndex)
 				}
 				}
 			})
 			})
@@ -289,110 +375,147 @@
 			this.handleDataSelect(0)
 			this.handleDataSelect(0)
 			this.currentExamItem = JSON.parse(localStorage.getItem('curExam'))
 			this.currentExamItem = JSON.parse(localStorage.getItem('curExam'))
 			console.log(this.currentExamItem)
 			console.log(this.currentExamItem)
-        },
-        computed: {
-            getSubjectList() {
+
+			if (this.getAnalysisJson) {
+				this.classList = ['全部'].concat([...new Set(this.getAnalysisJson.classes.map(item => item
+					.className))]) // 获取班级列表
+			}
+		},
+		computed: {
+			// 获取最新成绩分析模块数据
+			getAnalysisJson() {
+				return this.$store.state.totalAnalysis.analysisJson
+			},
+			getSubjectList() {
 				this.subjectSelectVal = this.$store.state.totalAnalysis.currentSubject
 				this.subjectSelectVal = this.$store.state.totalAnalysis.currentSubject
-                return this.$store.state.totalAnalysis.subjectList
-            },
+				return this.$store.state.totalAnalysis.subjectList
+			},
 			getVuexExamList() {
 			getVuexExamList() {
-			    return this.$store.state.totalAnalysis.examList
+				return this.$store.state.totalAnalysis.examList
 			},
 			},
 			getVuexExcelData() {
 			getVuexExcelData() {
-			    return this.$store.state.totalAnalysis.exportTableParams
+				return this.$store.state.totalAnalysis.exportTableParams
 			},
 			},
-			getJoinRate(){
+			getJoinRate() {
 				return (this.currentExamItem.stuCount / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
 				return (this.currentExamItem.stuCount / this.currentExamItem.stuCount).toFixed(2) * 100 + '%'
 			}
 			}
-        },
-        // 监听部分路由变化
-        watch: {
-            '$route'(to, from) {
-                this.handleBackToTop()
-                if (to.path === '/total' && from.path === '/totalindex') {
-                    this.isShowEvaluations = false
-                    this.isShowQuestions = false
-                    this.$refs.examListRef.examIndex = to.query.index
-                }
-            },
-    //         getSubjectList(val) {
-    //             console.log('科目列表变化为' + val)
-    //             console.log(this.subjectList)
-				// console.log(this.$store.state.totalAnalysis.currentExam)
-    //             this.subjectList = val
-    //             this.subjectSelectVal = this.subjectList[0]
-    //             // this.handleSubjectChange(this.subjectSelectVal)
-    //         },
-            getVuexExamList(val) {
+		},
+		// 监听部分路由变化
+		watch: {
+			'$route'(to, from) {
+				this.handleBackToTop()
+				if (to.path === '/total' && from.path === '/totalindex') {
+					this.isShowEvaluations = false
+					this.isShowQuestions = false
+					this.$refs.examListRef.examIndex = to.query.index
+				}
+			},
+			getVuexExamList(val) {
 				console.log(val)
 				console.log(val)
-                if(val.length){
+				if (val.length) {
 					this.examList = val
 					this.examList = val
 				}
 				}
-            },
-			getVuexExcelData(val){
+			},
+			getVuexExcelData(val) {
 				console.log('表格数据变化')
 				console.log('表格数据变化')
 				console.log(val)
 				console.log(val)
 				this.onMultipleDownLoad(val)
 				this.onMultipleDownLoad(val)
 			}
 			}
-        }
-    }
+		}
+	}
 </script>
 </script>
 
 
 <style src="./index.less" lang="less" scoped></style>
 <style src="./index.less" lang="less" scoped></style>
 
 
-<style>
-    .total-content .basic-tools .ivu-input {
-        background: transparent;
-        border: 1px solid #595959;
-        height: 30px;
-        padding-left: 10px;
-        font-size: 14px;
-        font-weight: bold;
-        color: #a2a2a2;
-        box-shadow: none;
-        border-radius: 5px;
-    }
-
-        .total-content .basic-tools .ivu-input::-webkit-input-placeholder {
-            color: #616161;
-        }
-
-    .export-modal .ivu-modal-header {
-        display: none;
-    }
-
-    /*全科单科选择部分*/
-
-    .total-content .basic-tools .ivu-select {
-        margin: 5px 20px 5px 0;
-        height: 30px;
-    }
-
-    .total-content .ivu-select-single .ivu-select-selection {
-        height: 30px;
-        background: transparent;
-        border: 1px solid #595959;
-        box-shadow: none;
-        color: #cecece;
-    }
-
-    .total-content .ivu-select-single .ivu-select-placeholder {
-        height: 30px;
-        line-height: 30px;
-        font-size: 16px;
-    }
-
-    .total-content .ivu-spin-fix {
-        background: rgba(209, 209, 209, 0.51);
-    }
-
-    .total-content .ivu-spin-dot {
-        width: 100px;
-        height: 100px;
-    }
-
-    .export-modal .ivu-modal-content {
-        background: #fff;
-        color: #757575;
-    }
+<style lang="less">
+	.total-content .analysis-select {
+		width: 140px;
+		margin-right: 20px;
+
+		.ivu-select-selection {
+			width: 140px;
+			background-color: #252525e3 !important;
+			border-radius: 0;
+			border-color: #96969640 !important;
+		}
+
+		.ivu-select-dropdown {
+			background-color: #3c3c3c;
+
+			.ivu-select-item {
+				color: #e6e6e6;
+
+				&:hover {
+					background-color: #565656;
+				}
+			}
+
+			.ivu-select-item-focus {
+				background-color: #565656;
+			}
+		}
+	}
+
+	.total-content {
+		.basic-tools {
+			.ivu-input {
+				background: transparent;
+				border: 1px solid #595959;
+				height: 30px;
+				padding-left: 10px;
+				font-size: 14px;
+				font-weight: bold;
+				color: #a2a2a2;
+				box-shadow: none;
+				border-radius: 5px;
+
+				&::-webkit-input-placeholder {
+					color: #616161;
+				}
+			}
+
+			.ivu-select {
+				margin: 5px 20px 5px 0;
+				height: 30px;
+			}
+		}
+
+		.ivu-select-single {
+			.ivu-select-selection {
+				height: 30px;
+				background: transparent;
+				border: 1px solid #595959;
+				box-shadow: none;
+				color: #cecece;
+			}
+
+			.ivu-select-placeholder {
+				height: 30px;
+				line-height: 30px;
+				font-size: 16px;
+			}
+		}
+
+		.ivu-spin-fix {
+			background: rgba(209, 209, 209, 0.51);
+		}
+
+		.ivu-spin-dot {
+			width: 100px;
+			height: 100px;
+		}
+	}
+
+	.export-modal {
+		.ivu-modal-header {
+			display: none;
+		}
+
+		.ivu-modal-content {
+			background: #fff;
+			color: #757575;
+		}
+	}
+
+	/*全科单科选择部分*/
 </style>
 </style>

+ 50 - 45
TEAMModelOS/ClientApp/src/view/vote/ManageVote.vue

@@ -345,57 +345,62 @@
 			 */
 			 */
 			async getVoteStudents(voteItem) {
 			async getVoteStudents(voteItem) {
 				this.isLoading = true
 				this.isLoading = true
-				let records = await this.getVoteRecord(voteItem)
-				//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
-				console.log('当前投票的作答数据======',records)
-				this.$api.schoolSetting.getClassroomStudent({
-					school_code: this.$store.state.userInfo.schoolCode,
-					ids: voteItem.classes,
-					scope:voteItem.owner === this.$store.state.userInfo.schoolCode ? 'school' : 'private'
-				}).then(res => {
-					if (!res.error && res.stus.length) {
-						let list = []
-						res.stus.forEach(classStus => {
-							classStus.forEach(i => {
-								list.push({
-									id: i.id,
-									name: i.name,
-									no: i.no,
-									classroomName: i.className
+				try{
+					let records = await this.getVoteRecord(voteItem)
+					//  先查找 投票发布对象关联的学生清单 然后再去判断学生的作答情况
+					console.log('当前投票的作答数据======',records)
+					this.$api.schoolSetting.getClassroomStudent({
+						school_code: this.$store.state.userInfo.schoolCode,
+						ids: voteItem.classes,
+						scope:voteItem.scope
+					}).then(res => {
+						if (!res.error && res.stus.length) {
+							let list = []
+							res.stus.forEach(classStus => {
+								classStus.forEach(i => {
+									list.push({
+										id: i.id,
+										name: i.name,
+										no: i.no,
+										classroomName: i.className
+									})
 								})
 								})
 							})
 							})
-						})
-						
-						// 要根据作答情况 结合两张表 处理表格显示的数据 
-						if (records.options.length) {
-							let arr = []
-							this.studentsTable = list
-							records.options.forEach((item, index) => {
-								arr.push({
-									option: item.code ? this.$t('vote.option') + (index + 1) : this.$t('vote.noVote'),
-									key: item.code || '',
-									result: new Array(item.count).fill('1')
+							
+							// 要根据作答情况 结合两张表 处理表格显示的数据 
+							if (records.options.length) {
+								let arr = []
+								this.studentsTable = list
+								records.options.forEach((item, index) => {
+									arr.push({
+										option: item.code ? this.$t('vote.option') + (index + 1) : this.$t('vote.noVote'),
+										key: item.code || '',
+										result: new Array(item.count).fill('1')
+									})
 								})
 								})
-							})
-							this.studentsTable.forEach(i => {
-								let matchList = records.records.filter(j => j.userid === i.id)
-								i.option = matchList.length ? Object.keys(matchList[0].opt).join(',') : null
-							})
-							console.log(arr)
-							console.log(this.studentsTable)
-							this.tableData = arr
+								this.studentsTable.forEach(i => {
+									let matchList = records.records.filter(j => j.userid === i.id)
+									i.option = matchList.length ? Object.keys(matchList[0].opt).join(',') : null
+								})
+								console.log(arr)
+								console.log(this.studentsTable)
+								this.tableData = arr
+							} else {
+								this.studentsTable = []
+								this.tableData = []
+							}
 						} else {
 						} else {
-							this.studentsTable = []
-							this.tableData = []
+							this.$Message.error(this.$t('vote.getDataFailTip'))
 						}
 						}
-					} else {
-						this.$Message.error(this.$t('vote.getDataFailTip'))
-					}
-				}).catch(err => {
-					this.$Message.error(this.$t('vote.getClassDataFailTip'))
-				}).finally(() => {
+					}).catch(err => {
+						this.$Message.error(this.$t('vote.getClassDataFailTip'))
+					}).finally(() => {
+						this.isLoading = false
+					})
+				}catch(e){
 					this.isLoading = false
 					this.isLoading = false
-				})
+				}
+				
 			},
 			},
 
 
 
 

+ 1 - 1
TEAMModelOS/Controllers/Analysis/AnalysisController.cs

@@ -667,7 +667,7 @@ namespace TEAMModelOS.Controllers.Analysis
                         values.Add("-");
                         values.Add("-");
                     });
                     });
                     values[0] = (k + 1).ToString();
                     values[0] = (k + 1).ToString();
-                    values[1] = "";
+                    values[1] =  "";
                     values[2] = topic[k].ToString();
                     values[2] = topic[k].ToString();
                     values[3] = e.paper.point[k].ToString();
                     values[3] = e.paper.point[k].ToString();
 /*                    List<string> sk = new List<string>();
 /*                    List<string> sk = new List<string>();

+ 1 - 1
TEAMModelOS/Controllers/Client/HiTeachController.cs

@@ -823,7 +823,7 @@ namespace TEAMModelOS.Controllers.Client
             //Case 2 取得班級固定成員
             //Case 2 取得班級固定成員
             if(grant_type.GetString() == "school" && students.Count == 0 && !string.IsNullOrWhiteSpace(classId) && string.IsNullOrWhiteSpace(stulist))
             if(grant_type.GetString() == "school" && students.Count == 0 && !string.IsNullOrWhiteSpace(classId) && string.IsNullOrWhiteSpace(stulist))
             {
             {
-                var query = $"SELECT c.id, c.name, c.no, c.schoolId FROM c WHERE c.classId = '{classId}'";
+                var query = $"SELECT c.id, c.name, c.no, c.schoolId, c.groupId, c.groupName FROM c WHERE c.classId = '{classId}'";
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{school_code}") }))
                 await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{school_code}") }))
                 {
                 {
                     using var jsonst = await JsonDocument.ParseAsync(item.ContentStream);
                     using var jsonst = await JsonDocument.ParseAsync(item.ContentStream);

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

@@ -121,7 +121,7 @@ namespace TEAMModelOS.Controllers
                     {
                     {
                         //发布对象为自选名单(校本)
                         //发布对象为自选名单(校本)
                         List<StuList> stuLists = new List<StuList>();
                         List<StuList> stuLists = new List<StuList>();
-                        await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c where c.id = '{request.classes[i]}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))
+                        await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<StuList>(queryText: $"select value(c) from c where c.id = '{request.classes[i]}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{request.school}") }))
                         {
                         {
                             stuLists.Add(item);
                             stuLists.Add(item);
                         }
                         }

+ 0 - 187
TEAMModelOS/Controllers/Common/SurveyController.cs

@@ -482,193 +482,6 @@ namespace TEAMModelOS.Controllers
             }
             }
             return Ok(new {records = res});
             return Ok(new {records = res});
         }
         }
-
-
-        /// <summary>
-        /// 问卷记录 当活动没结算且没有BlobUrl时则调用此接口
-        /// </summary>
-        /// <redis>
-        /// {"C":2,"A":2,"other":2}
-        /// </redis>
-        /// <param name="request">
-        /// !"id":"aaaa"
-        /// !"code":"Survey-hbcn"/"code":"Survey-1606285227"
-        /// </param>
-        /// <returns>
-        /// </returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("settlement")]
-        //[AuthToken(Roles = "teacher,student")]
-        public async Task<IActionResult> Settlement(JsonElement request)
-        {
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                //活动id
-                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                //活动分区
-                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                Survey survey = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Survey>(id.GetString(), new PartitionKey($"{code}"));
-                List<ChangeRecord> changeRecords = await _azureStorage.FindListByDict<ChangeRecord>(new Dictionary<string, object>() { { "RowKey", $"{id}" }, { "PartitionKey", survey.progress } });
-                ActivityData data = null;
-                if (survey != null)
-                {
-                    var adid = survey.id;
-                    var adcode = $"Activity-{survey.school}";
-                    try {
-                        if (survey.scope == "school")
-                        {
-                            data = await client.GetContainer("TEAMModelOS", "School").ReadItemAsync<ActivityData>(adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                        }
-                        else if (survey.scope == "private")
-                        {
-                            data = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<ActivityData>(adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                        }
-                    } catch {
-                        data = null;
-                    }
-                    if (survey.ttl >= 1)
-                    {
-                        _azureRedis.GetRedisClient(8).KeyDelete($"Survey:Record:{survey.id}");
-                        _azureRedis.GetRedisClient(8).KeyDelete($"Survey:Submit:{survey.id}");
-                        if (data != null)
-                        {
-                            data.ttl = 1;
-                            if (survey.scope == "school")
-                            {
-                                data = await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                            }
-                            else if (survey.scope == "private")
-                            {
-                                data = await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, adid, new Azure.Cosmos.PartitionKey($"{adcode}"));
-                            }
-                        }
-                        await _dingDing.SendBotMsg($"问卷调查【{survey.name}-{survey.id}】被删除", GroupNames.醍摩豆服務運維群組);
-                        return Ok();
-                    }
-                    else
-                    {
-                        switch (survey.progress)
-                        {
-
-                            case "finish":
-                                var records = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Survey:Record:{survey.id}");
-                                List<dynamic> recs = new List<dynamic>();
-                                foreach (var rcd in records)
-                                {
-                                    var value = rcd.Value.ToString().ToObject<JsonElement>();
-                                    recs.Add(new { index = rcd.Name.ToString(), ans = value });
-                                }
-                                var cods = new { records = recs };
-                                //问卷整体情况
-                                await _azureStorage.UploadFileByContainer(survey.blobcntr, cods.ToJsonString(), "survey", $"{survey.id}/record.json");
-                                //结算每道题的答题情况
-
-                                var ContainerClient = _azureStorage.GetBlobContainerClient(survey.blobcntr);
-                                var route = ContainerClient.Uri.ToString();
-
-                                //获取
-
-                                try
-                                {
-                                    List<string> items = await ContainerClient.List($"survey/{survey.id}/urecord");
-                                    List<SurveyRecord> surveyRecords = new List<SurveyRecord>();
-                                    (string uri, string sas) blobAuth = _azureStorage.GetBlobContainerSAS(survey.blobcntr, BlobContainerSasPermissions.Read);
-                                    string sas = blobAuth.sas;
-                                    var rcode = await _clientFactory.CreateClient().GetAsync(new Uri($"{route}/survey/{survey.id}/record.json?{sas}"));
-                                    var jsonc = await JsonDocument.ParseAsync(await rcode.Content.ReadAsStreamAsync());
-                                    var Recordc = jsonc.RootElement.ToObject<JsonElement>();
-                                    HttpClient httpClient = _clientFactory.CreateClient();
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算数据11111--->>{Recordc.ToJsonString()}", GroupNames.成都开发測試群組);
-                                    foreach (string item in items)
-                                    {
-                                        var url = $"{route}/{item}?{sas}";
-                                        var response = await httpClient.GetAsync(new Uri(url));
-                                        var json = await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync());
-                                        var Record = json.RootElement.ToObject<SurveyRecord>();
-                                        surveyRecords.Add(Record);
-                                    }
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算数据{surveyRecords.ToJsonString()}", GroupNames.成都开发測試群組);
-                                    for (int index = 0; index < survey.answers.Count; index++)
-                                    {
-                                        string url = $"{survey.id}/qrecord/{index}.json";
-                                        QuestionRecord question = new QuestionRecord() { index = index };
-                                        foreach (SurveyRecord record in surveyRecords)
-                                        {
-                                            if (record.ans.Count == survey.answers.Count)
-                                            {
-                                                foreach (var an in record.ans[index])
-                                                {
-                                                    //
-                                                    if (question.opt.ContainsKey(an))
-                                                    {
-                                                        if (question.opt[an] != null)
-                                                        {
-                                                            question.opt[an].Add(record.userid);
-                                                        }
-                                                        else
-                                                        {
-                                                            question.opt[an] = new HashSet<string>() { record.userid };
-                                                        }
-                                                    }
-                                                    else
-                                                    {
-                                                        if (survey.answers[index].Contains(an))
-                                                        {
-                                                            //如果是客观题code
-                                                            question.opt.Add(an, new HashSet<string> { record.userid });
-                                                        }
-                                                        else
-                                                        {
-                                                            //如果不是客观code
-                                                            question.other[record.userid] = an;
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-                                        await _azureStorage.UploadFileByContainer(survey.blobcntr, question.ToJsonString(), "survey", url);
-                                    }
-                                }
-                                catch (Exception ex)
-                                {
-                                    await _dingDing.SendBotMsg($"问卷调查问题结算异常{ex.Message}\n{ex.StackTrace}", GroupNames.成都开发測試群組);
-                                }
-                                if (string.IsNullOrEmpty(survey.recordUrl))
-                                {
-                                    survey.recordUrl = $"/survey/{survey.id}/record.json";
-                                    await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Survey>(survey, survey.id, new Azure.Cosmos.PartitionKey(survey.code));
-                                }
-                                else
-                                {
-                                    //异动,且已经有结算记录则不必再继续。
-                                    //break;
-                                }
-                                // await Task.WhenAll(tasks);
-                                //更新结束状态
-                                data.progress = "finish";
-                                if (survey.scope == "school")
-                                {
-                                    await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                                }
-                                else if (survey.scope == "private")
-                                {
-                                    await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                                }
-                                break;
-                        }
-                    }
-
-                }
-                return Ok();
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest(ex.StackTrace);
-            }
-        }
-
     }
     }
     public class QuestionRecord
     public class QuestionRecord
     {
     {

+ 0 - 123
TEAMModelOS/Controllers/Common/VoteController.cs

@@ -482,128 +482,5 @@ namespace TEAMModelOS.Controllers.Learn
             }
             }
             else { return Ok(new { msgid = 0 }); }
             else { return Ok(new { msgid = 0 }); }
         }
         }
-
-        /// <summary>
-        /// 问卷记录 当活动没结算且没有BlobUrl时则调用此接口
-        /// </summary>
-        /// <redis>
-        /// {"C":2,"A":2,"other":2}
-        /// </redis>
-        /// <param name="request">
-        /// !"id":"aaaa"
-        /// !"code":"Survey-hbcn"/"code":"Survey-1606285227"
-        /// </param>
-        /// <returns>
-        /// </returns>
-        [ProducesDefaultResponseType]
-        [HttpPost("settlement")]
-        //[AuthToken(Roles = "teacher,student")]
-        public async Task<IActionResult> Settlement(JsonElement request)
-        {
-            try
-            {
-                var client = _azureCosmos.GetCosmosClient();
-                //活动id
-                if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
-                //活动分区
-                if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
-                Vote vote = await client.GetContainer("TEAMModelOS", "Common").ReadItemAsync<Vote>(id.GetString(), new PartitionKey($"{code}"));
-                if (vote != null)
-                {
-                    ActivityData data;
-
-                    if (vote.progress == "finish")
-                    {
-                        //获取投票活动的所有投票记录
-                        var records = await _azureRedis.GetRedisClient(8).HashGetAllAsync($"Vote:Record:{vote.id}");
-                        //获取投票活动的选项及投票数
-                        var counts = _azureRedis.GetRedisClient(8).SortedSetRangeByScoreWithScores($"Vote:Count:{vote.id}");
-                        List<dynamic> countcds = new List<dynamic>();
-                        if (counts != null && counts.Length > 0)
-                        {
-                            foreach (var count in counts)
-                            {
-                                countcds.Add(new { code= count.Element.ToString() , count = (int)count.Score });
-                            }
-                        }
-                        List<Task<string>> tasks = new List<Task<string>>();
-                        List<VoteRecord> recordsBlob = new List<VoteRecord>();
-                        foreach (var rcd in records)
-                        {
-                            var value = rcd.Value.ToString().ToObject<VoteRecord>();
-                            recordsBlob.Add(value);
-                        }
-                        //分组每个人的 
-                        var gp = recordsBlob.GroupBy(x => x.userid).Select(x => new { key = x.Key, list = x.ToList() });
-                        foreach (var g in gp)
-                        {
-                            tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, g.list.ToJsonString(), "vote", $"{vote.id}/urecord/{g.key}.json"));
-                        }
-                        //处理活动方的记录, 
-                        string url = $"/vote/{vote.id}/record.json";
-                        vote.recordUrl = url;
-                        tasks.Add(_azureStorage.UploadFileByContainer(vote.blobcntr, new{ options = countcds, records = recordsBlob }   .ToJsonString(), "vote", $"{vote.id}/record.json"));
-                        //处理投票者的记录
-                        await Task.WhenAll(tasks);
-                        //
-                        if (string.IsNullOrEmpty(vote.recordUrl))
-                        {
-                            await client.GetContainer("TEAMModelOS", "Common").ReplaceItemAsync<Vote>(vote, vote.id, new Azure.Cosmos.PartitionKey(vote.code));
-                        }
-                        //更新结束状态
-                        if (vote.scope == "school")
-                        {
-                            data = new ActivityData
-                            {
-                                id = vote.id,
-                                code = $"Activity-{vote.school}",
-                                type = "vote",
-                                name = vote.name,
-                                startTime = vote.startTime,
-                                endTime = vote.endTime,
-                                scode = vote.code,
-                                scope = vote.scope,
-                                progress = "finish",
-                                classes = vote.classes.IsNotEmpty() ? vote.classes : new List<string> { "" },
-                                tmdids = vote.tmdids.IsNotEmpty() ? vote.tmdids : new List<string> { "" },
-                                subjects = new List<string> { "" }
-
-                            };
-                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                        }
-                        else if (vote.scope == "private")
-                        {
-                            //更新结束状态
-                            data = new ActivityData
-                            {
-                                id = vote.id,
-                                code = $"Activity-Common",
-                                type = "vote",
-                                name = vote.name,
-                                startTime = vote.startTime,
-                                endTime = vote.endTime,
-                                scode = vote.code,
-                                scope = vote.scope,
-                                progress = "finish",
-                                classes = vote.classes.IsNotEmpty() ? vote.classes : new List<string> { "" },
-                                tmdids = new List<string> { "" },
-                                subjects = new List<string> { "" }
-                            };
-                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync<ActivityData>(data, data.id, new Azure.Cosmos.PartitionKey(data.code));
-                        }
-                    }
-                    return Ok(new { vote });
-                }
-                else
-                {
-                    return BadRequest("id,code不存在!");
-                }
-            }
-            catch (Exception ex)
-            {
-                await _dingDing.SendBotMsg($"OS,{_option.Location},common/survey/find-id()\n{ex.Message}", GroupNames.醍摩豆服務運維群組);
-                return BadRequest(ex.StackTrace);
-            }
-        }
     }
     }
 }
 }

+ 172 - 141
TEAMModelOS/Controllers/School/ClassRoomController.cs

@@ -54,7 +54,7 @@ namespace TEAMModelOS.Controllers
                 //students = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", classroom.id } });
                 //students = await _azureCosmos.FindByDict<Student>(new Dictionary<string, object>() { { "classroomCode", classroom.id } });
                 if (option.ToString().Equals("insert"))
                 if (option.ToString().Equals("insert"))
                 {
                 {
-                    if (classroom.scope.Equals("private"))
+                    /*if (classroom.scope.Equals("private"))
                     {
                     {
                         List<string> resultIds = new List<string>();
                         List<string> resultIds = new List<string>();
                         await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                         await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
@@ -89,7 +89,7 @@ namespace TEAMModelOS.Controllers
                         }
                         }
                     }
                     }
                     else
                     else
-                    {
+                    {*/
                         List<string> resultIds = new List<string>();
                         List<string> resultIds = new List<string>();
                         await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                         await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                         {
                         {
@@ -121,47 +121,24 @@ namespace TEAMModelOS.Controllers
                             classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(classroom, new PartitionKey($"Class-{school_code}"));
                             classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(classroom, new PartitionKey($"Class-{school_code}"));
 
 
                         }
                         }
-                    }
+                   // }
                 }
                 }
                 else
                 else
                 {
                 {
-
-                    if (classroom.scope.Equals("private"))
-                    {
-                        List<string> resultIds = new List<string>();
-                        await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
-                        {
-                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                            {
-                                var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
-                                while (accounts.MoveNext())
-                                {
-                                    JsonElement account = accounts.Current;
-                                    resultIds.Add(account.GetProperty("id").GetString());
-                                }
-                            }
-                        }
-                        if (resultIds.Count > 0)
-                        {
-                            return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
-                        }
-                        //Class own = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemAsync<Class>(classroom.id, new PartitionKey($"Class-{school_code}"));
-                        classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
-                    }
-                    else
+                    var response = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"Class-{school_code}"));
+                    if (response.Status == 200)
                     {
                     {
-                        //检查该教室是否是老师创建的个人校本教室
-                        var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(classroom.id, new PartitionKey($"Class-{school_code}"));
-                        if (response.Status == 200)
+                        using var json = await JsonDocument.ParseAsync(response.ContentStream);
+                        Class @class = json.ToObject<Class>();
+                        if (!@class.no.Equals(classroom.no))
                         {
                         {
                             List<string> resultIds = new List<string>();
                             List<string> resultIds = new List<string>();
-                            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                             {
                             {
-                                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                using var document = await JsonDocument.ParseAsync(item.ContentStream);
+                                if (document.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                                 {
                                 {
-                                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                    var accounts = document.RootElement.GetProperty("Documents").EnumerateArray();
                                     while (accounts.MoveNext())
                                     while (accounts.MoveNext())
                                     {
                                     {
                                         JsonElement account = accounts.Current;
                                         JsonElement account = accounts.Current;
@@ -173,12 +150,18 @@ namespace TEAMModelOS.Controllers
                             {
                             {
                                 return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
                                 return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
                             }
                             }
-                            classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
                         }
                         }
-                        else
+                        classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
+                    }
+                    else {
+                        classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").CreateItemAsync(classroom, new PartitionKey($"Class-{school_code}"));
+                    }                                       
+                        //检查该教室是否是老师创建的个人校本教室
+                        /*var response = await client.GetContainer("TEAMModelOS", "Teacher").ReadItemStreamAsync(classroom.id, new PartitionKey($"Class-{school_code}"));
+                        if (response.Status == 200)
                         {
                         {
                             List<string> resultIds = new List<string>();
                             List<string> resultIds = new List<string>();
-                            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
                             {
                             {
                                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
@@ -195,87 +178,88 @@ namespace TEAMModelOS.Controllers
                             {
                             {
                                 return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
                                 return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
                             }
                             }
-                            /*List<StudentSimple> studentSimples = new List<StudentSimple>();
-                            StringBuilder sql = new StringBuilder();
-                            sql.Append("select A0.id,A0.name,A0.no from c join A0 in c.students ");
-                            Dictionary<string, object> dict = new Dictionary<string, object>();
-                            dict.Add("scope", classroom.scope);
-                            dict.Add("id", classroom.id);
-                            AzureCosmosQuery cosmosDbQuery = SQLHelper.GetSQL(dict, sql);
-                            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryDefinition: cosmosDbQuery.CosmosQueryDefinition, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
-                            {
-                                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                {
-                                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                    {
-                                        studentSimples.Add(obj.ToObject<StudentSimple>());
-                                    }
-                                }
-                            }
-                            classroom.students = studentSimples;*/
-
-                            List<TeacherCourse> course = new List<TeacherCourse>();
-                            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.classes where A0.id = '{classroom.id}'"))
-                            {
-                                using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                                {
-                                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                                    {
-                                        course.Add(obj.ToObject<TeacherCourse>());
-                                    }
-                                }
-                            }
-
-                            for (int i = 0; i < course.Count; i++)
-                            {
-                                bool flag = false;
-                                for (int j = 0; j < course[i].classes.Count; j++)
-                                {
-                                    if (!course[i].classes[j].name.Equals(classroom.name))
-                                    {
-                                        flag = true;
-                                        course[i].classes[j].name = classroom.name;
-                                        //break;
-                                    }
-                                    if (!course[i].classes[j].teacher.id.Equals(classroom.teacher.id))
-                                    {
-                                        flag = true;
-                                        course[i].classes[j].teacher.id = classroom.teacher.id;
-                                        course[i].classes[j].teacher.name = classroom.teacher.name;
-                                        //break;
-                                    }
-                                }
-                                if (flag)
-                                {
-                                    await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course[i], course[i].id, new PartitionKey($"{course[i].code}"));
-                                }
-                            }
-                            //string code = classroom.code.Substring(classroom.pk.Length + 1);
-                            //[Jeff] CourseManagement表廢除 刪除預定:以下CourseManagement更新程序
-                            var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"CourseManagement-{school_code}"));
-                            if (sresponse.Status == 200)
-                            {
-                                using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
-                                CourseManagement classroom1 = json.ToObject<CourseManagement>();
-                                if (!classroom1.name.Equals(classroom.name))
-                                {
-                                    classroom1.name = classroom.name;
-                                    await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom1.code}"));
-                                }
-                                if (!string.IsNullOrEmpty(classroom1.teacher.id) && !string.IsNullOrEmpty(classroom.teacher.id) && !classroom1.teacher.id.Equals(classroom.teacher.id))
-                                {
-                                    classroom1.teacher.name = classroom.teacher.name;
-                                    classroom1.teacher.id = classroom.teacher.id;
-                                    await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom1.code}"));
-                                }
-                            }
-                            ////[Jeff] CourseManagement表廢除 刪除預定:以下CourseManagement更新程序
-                            classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
+                            classroom = await _azureCosmos.GetCosmosClient().GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(classroom, classroom.id, new PartitionKey($"Class-{school_code}"));
                         }
                         }
-
-                    }
+                        else
+                        {*/
+                        /*                            List<string> resultIds = new List<string>();
+                                                    await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: $"select c.id from c where c.periodId = '{classroom.periodId}' and c.no = '{classroom.no}' ", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{school_code}") }))
+                                                    {
+                                                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                                                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                                        {
+                                                            var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                                            while (accounts.MoveNext())
+                                                            {
+                                                                JsonElement account = accounts.Current;
+                                                                resultIds.Add(account.GetProperty("id").GetString());
+                                                            }
+                                                        }
+                                                    }
+                                                    if (resultIds.Count > 0)
+                                                    {
+                                                        return Ok(new { error = ResponseCode.DATA_EXIST, V = "班级编码已经存在!" });
+                                                    }
+                                                    List<TeacherCourse> course = new List<TeacherCourse>();
+                                                    await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: $"select value(c) from c join A0 in c.classes where A0.id = '{classroom.id}'"))
+                                                    {
+                                                        using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                                                        if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                                        {
+                                                            foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                                                            {
+                                                                course.Add(obj.ToObject<TeacherCourse>());
+                                                            }
+                                                        }
+                                                    }*/
+
+                        /*                            for (int i = 0; i < course.Count; i++)
+                                                    {
+                                                        bool flag = false;
+                                                        for (int j = 0; j < course[i].classes.Count; j++)
+                                                        {
+                                                            if (!course[i].classes[j].name.Equals(classroom.name))
+                                                            {
+                                                                flag = true;
+                                                                course[i].classes[j].name = classroom.name;
+                                                                //break;
+                                                            }
+                                                            if (!course[i].classes[j].teacher.id.Equals(classroom.teacher.id))
+                                                            {
+                                                                flag = true;
+                                                                course[i].classes[j].teacher.id = classroom.teacher.id;
+                                                                course[i].classes[j].teacher.name = classroom.teacher.name;
+                                                                //break;
+                                                            }
+                                                        }
+                                                        if (flag)
+                                                        {
+                                                            await client.GetContainer("TEAMModelOS", "Teacher").ReplaceItemAsync(course[i], course[i].id, new PartitionKey($"{course[i].code}"));
+                                                        }
+                                                    }*/
+                        //string code = classroom.code.Substring(classroom.pk.Length + 1);
+                        //[Jeff] CourseManagement表廢除 刪除預定:以下CourseManagement更新程序
+                        /*                            var sresponse = await client.GetContainer("TEAMModelOS", "School").ReadItemStreamAsync(classroom.id, new PartitionKey($"CourseManagement-{school_code}"));
+                                                    if (sresponse.Status == 200)
+                                                    {
+                                                        using var json = await JsonDocument.ParseAsync(sresponse.ContentStream);
+                                                        CourseManagement classroom1 = json.ToObject<CourseManagement>();
+                                                        if (!classroom1.name.Equals(classroom.name))
+                                                        {
+                                                            classroom1.name = classroom.name;
+                                                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom1.code}"));
+                                                        }
+                                                        if (!string.IsNullOrEmpty(classroom1.teacher.id) && !string.IsNullOrEmpty(classroom.teacher.id) && !classroom1.teacher.id.Equals(classroom.teacher.id))
+                                                        {
+                                                            classroom1.teacher.name = classroom.teacher.name;
+                                                            classroom1.teacher.id = classroom.teacher.id;
+                                                            await client.GetContainer("TEAMModelOS", "School").ReplaceItemAsync(classroom1, classroom1.id, new PartitionKey($"{classroom1.code}"));
+                                                        }
+                                                    }*/
+                        ////[Jeff] CourseManagement表廢除 刪除預定:以下CourseManagement更新程序                           
+                        //}
+
+                    //}
 
 
                 }
                 }
                 return Ok(new { classroom });
                 return Ok(new { classroom });
@@ -466,8 +450,10 @@ namespace TEAMModelOS.Controllers
                                         o.no
                                         o.no
                                     })
                                     })
                 );
                 );
-                stus.AddRange(grpBalance);              
-                List<(string id, string code, string stuId, string name)> listStuList = new List<(string id, string code, string stuId, string name)>();
+                stus.AddRange(grpBalance);
+                //处理校本的自定义名单
+                List<(string id, string name, string pic, string code, string classId, string groupId, string groupName, string no)> listStuList = new List<(string id, string name, string pic, string code, string classId, string groupId, string groupName, string no)>();
+                List<(string id, string code, string stuId, string name)> stuListMore = new List<(string id, string code, string stuId, string name)>();
                 if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
                 if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
                 {
                 {
                     List<StuList> stuLists = new List<StuList>();
                     List<StuList> stuLists = new List<StuList>();
@@ -475,40 +461,60 @@ namespace TEAMModelOS.Controllers
                     {
                     {
                         stuLists.Add(item);
                         stuLists.Add(item);
                     }
                     }
+                    List<string> stuInfo = new List<string>();
                     if (stuLists.Count > 0)
                     if (stuLists.Count > 0)
                     {
                     {
                         foreach (StuList stuList in stuLists)
                         foreach (StuList stuList in stuLists)
                         {
                         {
                             foreach (Students stu in stuList.students)
                             foreach (Students stu in stuList.students)
                             {
                             {
-                                    listStuList.Add((stu.id,
+                                stuInfo.Add(stu.id);
+                                stuListMore.Add((stu.id,
                                                 stu.code,
                                                 stu.code,
                                                 stuList.id,
                                                 stuList.id,
                                                 stuList.name));
                                                 stuList.name));
                             }
                             }
 
 
                         }
                         }
-                        var infos = listStuList.GroupBy(m => new { m.stuId }).Distinct().Select(t => 
+                        //根据学生ID  CODE获取学生基本信息
+                        await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(
+                       queryText: $"select c.id,c.name,c.classId,c.code,c.groupId,c.groupName,c.no,c.picture from c where c.id in ({string.Join(",", stuInfo.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Base-{schoolId}") }))
+                        {
+                            using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                            if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                            {
+                                var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                while (accounts.MoveNext())
+                                {
+                                    JsonElement account = accounts.Current;
+                                    listStuList.Add((account.GetProperty("id").GetString(),
+                                        account.GetProperty("name").GetString(),
+                                        account.GetProperty("picture").GetString(),
+                                        account.GetProperty("code").GetString(),
+                                        account.GetProperty("classId").GetString(),
+                                        account.GetProperty("groupId").GetString(),
+                                        account.GetProperty("groupName").GetString(),
+                                        account.GetProperty("no").GetString()));
+                                }
+                            }
+                        }
+                        var infos = stuListMore.GroupBy(m => new { m.stuId }).Distinct().Select(t =>
                              t.ToList().Select(o =>
                              t.ToList().Select(o =>
                                     new
                                     new
                                     {
                                     {
                                         o.id,
                                         o.id,
                                         o.code,
                                         o.code,
-                                        o.stuId,
-                                        o.name
+                                        name = listStuList.FirstOrDefault(c => c.id == o.id).name,
+                                        pic = listStuList.FirstOrDefault(c => c.id == o.id).pic,
+                                        classId = o.stuId,
+                                        className = o.name,
+                                        groupId = listStuList.FirstOrDefault(c => c.id == o.id).groupId,
+                                        groupName = listStuList.FirstOrDefault(c => c.id == o.id).groupName,
+                                        no = listStuList.FirstOrDefault(c => c.id == o.id).no
                                     })
                                     })
                         );
                         );
-/*                        var infos = listStuList.Select(o =>
-                                    new
-                                    {
-                                        o.id,
-                                        o.code,
-                                        o.stuId,
-                                        o.name
-                                    });*/
                         stus.AddRange(infos);
                         stus.AddRange(infos);
-                        //stus.Add(suList);
-                    }
+                    }                                                        
                 }
                 }
                 else
                 else
                 {
                 {
@@ -524,8 +530,29 @@ namespace TEAMModelOS.Controllers
                         {
                         {
                             foreach (Students students in stuList.students)
                             foreach (Students students in stuList.students)
                             {
                             {
-
-                                    listStuList.Add((students.id,
+                                //根据学生ID  CODE获取学生基本信息
+                                await foreach (var item in client.GetContainer("TEAMModelOS", "Student").GetItemQueryStreamIterator(
+                               queryText: $"select c.id,c.name,c.classId,c.code,c.groupId,c.groupName,c.no,c.picture from c where c.id = '{students.id}'", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"{students.code}") }))
+                                {
+                                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                                    {
+                                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                                        while (accounts.MoveNext())
+                                        {
+                                            JsonElement account = accounts.Current;
+                                            listStuList.Add((account.GetProperty("id").GetString(),
+                                                account.GetProperty("name").GetString(),
+                                                account.GetProperty("picture").GetString(),
+                                                account.GetProperty("code").GetString(),
+                                                account.GetProperty("classId").GetString(),
+                                                account.GetProperty("groupId").GetString(),
+                                                account.GetProperty("groupName").GetString(),
+                                                account.GetProperty("no").GetString()));
+                                        }
+                                    }
+                                }
+                                stuListMore.Add((students.id,
                                                 students.code,
                                                 students.code,
                                                 stuList.id,
                                                 stuList.id,
                                                 stuList.name));
                                                 stuList.name));
@@ -534,25 +561,29 @@ namespace TEAMModelOS.Controllers
                             {
                             {
                                 foreach (string tid in stuList.tmids)
                                 foreach (string tid in stuList.tmids)
                                 {
                                 {
-                                    listStuList.Add((tid,
+                                    stuListMore.Add((tid,
                                                 default,
                                                 default,
                                                 stuList.id,
                                                 stuList.id,
                                                 stuList.name));
                                                 stuList.name));
                                 }
                                 }
                             }
                             }
                         }
                         }
-                        var infos = listStuList.GroupBy(m => new { m.stuId }).Distinct().Select(t => 
+                        var infos = stuListMore.GroupBy(m => new { m.stuId }).Distinct().Select(t => 
                             t.ToList().Select(o =>
                             t.ToList().Select(o =>
                                     new
                                     new
                                     {
                                     {
                                         o.id,
                                         o.id,
                                         o.code,
                                         o.code,
-                                        o.stuId,
-                                        o.name
+                                        name = listStuList.FirstOrDefault(c => c.id == o.id).name,
+                                        pic = listStuList.FirstOrDefault(c => c.id == o.id).pic,
+                                        classId = o.stuId,
+                                        className = o.name,
+                                        groupId = listStuList.FirstOrDefault(c => c.id == o.id).groupId,
+                                        groupName = listStuList.FirstOrDefault(c => c.id == o.id).groupName,
+                                        no = listStuList.FirstOrDefault(c => c.id == o.id).no
                                     })
                                     })
                         );
                         );
                         stus.AddRange(infos);
                         stus.AddRange(infos);
-                        //stus.Add(suList);
                     }
                     }
                 }             
                 }             
                 return Ok(new { stus });
                 return Ok(new { stus });

+ 173 - 47
TEAMModelOS/Controllers/School/CourseController.cs

@@ -852,38 +852,77 @@ namespace TEAMModelOS.Controllers
             if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!requert.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
             if (!requert.TryGetProperty("scope", out JsonElement scope)) return BadRequest();
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
+            HashSet<Course> courseList = new HashSet<Course>();
             List<object> courses = new List<object>();
             List<object> courses = new List<object>();
             //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
             //var query = $"select c.code,c.id,c.name from c join A0 in c.schedule where A0.classId = '{id}'";
+            //此处存在不同老师在同一间教室上相同的课程
             if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
             if (scope.ToString().Equals("school", StringComparison.OrdinalIgnoreCase))
             {
             {
-                var query = $"select c.code,c.id,c.name,A0 schedule from c join A0 in c.schedule where A0.classId = '{id}'";
-                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
+                var query = $"select distinct value(c) from c join A0 in c.schedule where A0.classId = '{id}'";
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
                 {
                 {
-                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
-                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
-                    {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
-                        {
-                            courses.Add(obj.ToObject<object>());
-                        }
-                    }
+                    courseList.Add(item);
                 }
                 }
             }
             }
             else {
             else {
-                var query = $"select c.code,c.id,c.name,A0 schedule from c join A0 in c.schedule where A0.stulist = '{id}'";
-                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
+                var query = $"select distinct value(c) from c join A0 in c.schedule where A0.stulist = '{id}'";
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryIterator<Course>(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
+                {
+                    courseList.Add(item);
+                }
+            }
+            HashSet<string> teacherIds = new HashSet<string>();
+            foreach (Course course in courseList) {
+                    foreach (Schedule schedule in course.schedule)
+                    {
+                        teacherIds.Add(schedule.teacherId);
+                    }
+            }
+            List<(string id, string name)> teachers = new List<(string id, string name)>();
+            if (teacherIds.Count > 0 ) {                
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
+                                    queryText: $"select c.id,c.name from c where c.id in ({ string.Join(",", teacherIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey("Base") }))
                 {
                 {
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     using var json = await JsonDocument.ParseAsync(item.ContentStream);
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                     {
                     {
-                        foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
                         {
                         {
-                            courses.Add(obj.ToObject<object>());
+                            JsonElement account = accounts.Current;
+                            teachers.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
                         }
                         }
                     }
                     }
                 }
                 }
+            }            
+            foreach (Course course in courseList) {
+                dynamic courseExtobj = new ExpandoObject();
+                courseExtobj.id = course.id;
+                courseExtobj.name = course.name;
+                courseExtobj.subject = course.subject;
+                courseExtobj.period = course.period;
+                courseExtobj.scope = course.scope;
+                courseExtobj.no = course.no;
+                courseExtobj.code = course.code;
+                courseExtobj.pk = course.pk;
+                List<object> scheList = new List<object>();
+                foreach (Schedule schedule in course.schedule)
+                {
+                    dynamic scheduleExtobj = new ExpandoObject();
+                    scheduleExtobj.classId = schedule.classId;
+                    scheduleExtobj.teacherId = schedule.teacherId;
+                    if (!string.IsNullOrEmpty(schedule.teacherId))
+                    {
+                        scheduleExtobj.teacherName = teachers.FirstOrDefault(c => c.id == schedule.teacherId).name;
+                    }
+                    scheduleExtobj.stulist = schedule.stulist;
+                    scheduleExtobj.time = schedule.time;
+                    scheduleExtobj.notice = schedule.notice;
+                    scheList.Add(scheduleExtobj);
+                }
+                courseExtobj.schedule = scheList;
+                courses.Add(courseExtobj);
             }
             }
-            
             return Ok(new { courses });
             return Ok(new { courses });
         }
         }
 
 
@@ -1134,61 +1173,148 @@ namespace TEAMModelOS.Controllers
             if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
             if (!request.TryGetProperty("id", out JsonElement id)) return BadRequest();
             if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
             if (!request.TryGetProperty("code", out JsonElement code)) return BadRequest();
             var client = _azureCosmos.GetCosmosClient();
             var client = _azureCosmos.GetCosmosClient();
-            List<Student> courses = new List<Student>();
-            var query = $"select A0.id,A0.name,A0.scope from c join A0 in c.classes";
+            //List<object> courses = new List<object>();
+            List<string> classIds = new List<string>();
+            List<(string id, string scope)> listClassInfo = new List<(string id, string scope)> ();
+            var query = $"select distinct c.scope,A0.stulist id from c join A0 in c.schedule where A0.teacherId = '{id}'";
             await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
             await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
             {
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 {
                 {
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                    while (accounts.MoveNext())
                     {
                     {
-                        courses.Add(obj.ToObject<Student>());
+                        JsonElement account = accounts.Current;
+                        if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
+                        {
+                            continue;
+                        }
+                        classIds.Add(account.GetProperty("id").GetString());
+                        listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));                       
                     }
                     }
                 }
                 }
             }
             }
-            //List<object> coursesBySchool = new List<object>();
-            var queryBySchool = $"select distinct c.id,c.name,c.scope from c  join A0  in c.courses join A1  in A0.teachers where A1.id = '{id}' ";
-            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: queryBySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"CourseManagement-{code}") }))
+            var querySchool = $"select distinct c.scope,A0.classId id from c join A0 in c.schedule where A0.teacherId = '{id}'";
+            await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{id}") }))
             {
             {
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 using var json = await JsonDocument.ParseAsync(item.ContentStream);
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
                 {
                 {
-                    foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
+                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                    while (accounts.MoveNext())
                     {
                     {
-                        courses.Add(obj.ToObject<Student>());
+                        JsonElement account = accounts.Current;
+                        if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
+                        {
+                            continue;
+                        }
+                        classIds.Add(account.GetProperty("id").GetString());
+                        listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
                     }
                     }
                 }
                 }
             }
             }
-            courses = courses.Distinct(new ListDistinct()).ToList();
-            //courses = courses.Distinct().ToList();
-            return Ok(new { courses, courses.Count });
-            //request.TryGetProperty("assistant[*]", out JsonElement element);
-            /*List<dynamic> room = new List<dynamic>();
-            var prop = new List<string> { "classes" };
-            if (request.TryGetProperty("code", out JsonElement code))
+            //List<object> coursesBySchool = new List<object>();
+            //var queryBySchool = $"select distinct c.id,c.name,c.scope from c  join A0  in c.courses join A1  in A0.teachers where A1.id = '{id}' ";
+            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: query, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
             {
             {
-                var teachers = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "code", code.ToString() } }, prop);
-                if (teachers.IsNotEmpty()) {
-                    teachers.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
-
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                {
+                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                    while (accounts.MoveNext())
+                    {
+                        JsonElement account = accounts.Current;
+                        if (string.IsNullOrEmpty(account.GetProperty("id").GetString())) {
+                            continue;
+                        }
+                        classIds.Add(account.GetProperty("id").GetString());
+                        listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
+                    }
                 }
                 }
             }
             }
-            if (request.TryGetProperty("assistant[*]", out JsonElement element)) { 
-                var assistant = await _azureCosmos.FindByDict<CoursePlan>(new Dictionary<string, object> { { "assistant[*]", element.ToString() } }, prop);
-                if (assistant.IsNotEmpty()) {
-                    assistant.Select(x => x.classes).ToList().ForEach(x => { x.ForEach(y => { data.Add(y.classroomCode); }); });
+            await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(queryText: querySchool, requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Course-{code}") }))
+            {
+                using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                {
+                    var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                    while (accounts.MoveNext())
+                    {
+                        JsonElement account = accounts.Current;
+                        if (string.IsNullOrEmpty(account.GetProperty("id").GetString()))
+                        {
+                            continue;
+                        }
+                        classIds.Add(account.GetProperty("id").GetString());
+                        listClassInfo.Add((account.GetProperty("id").GetString(), account.GetProperty("scope").GetString()));
+                    }
                 }
                 }
             }
             }
-            if (data.Count > 0) { 
-                var classRoom=  await _azureCosmos.FindByDict<Classroom>(new Dictionary<string, object> { { "id",data.ToArray() } } );
-                if (classRoom.IsNotEmpty()) {
-                    classRoom.ForEach(x => {
-                        room.Add(x);
-                    });
+            List<(string id, string name)> listClassList = new List<(string id, string name)>();
+            if (classIds.Count > 0) {
+                //List<(string id, string name)> listClassList = new List<(string id, string name)>();
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(
+                                    queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"Class-{code}") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
+                            //stuIds.Add(account.GetProperty("id").GetString());                           
+                        }
+                    }
                 }
                 }
-            }*/
-            //return builder.Data(room).Extend(new Dictionary<string, object> { { "count", room.Count } }).build();
+
+                await foreach (var item in client.GetContainer("TEAMModelOS", "School").GetItemQueryStreamIterator(
+                                    queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList-{code}") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
+                            //stuIds.Add(account.GetProperty("id").GetString());                           
+                        }
+                    }
+                }
+
+                await foreach (var item in client.GetContainer("TEAMModelOS", "Teacher").GetItemQueryStreamIterator(
+                                    queryText: $"select c.id,c.name from c where c.id in ({string.Join(",", classIds.Select(o => $"'{o}'"))})", requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey($"StuList") }))
+                {
+                    using var json = await JsonDocument.ParseAsync(item.ContentStream);
+                    if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
+                    {
+                        var accounts = json.RootElement.GetProperty("Documents").EnumerateArray();
+                        while (accounts.MoveNext())
+                        {
+                            JsonElement account = accounts.Current;
+                            listClassList.Add((account.GetProperty("id").GetString(), account.GetProperty("name").GetString()));
+                            //stuIds.Add(account.GetProperty("id").GetString());                           
+                        }
+                    }
+                }
+            }
+            
+
+            var courses = listClassInfo.Select(o =>
+                                    new
+                                    {
+                                        o.id,
+                                        o.scope,
+                                        name = listClassList.FirstOrDefault(c => c.id == o.id).name,                                      
+                                    }
+               );
+            //courses.Add(grpBalance);
+            //courses = courses.Distinct().ToList();
+            return Ok(new { courses});          
         }
         }
 
 
         // TODO 前端没在用
         // TODO 前端没在用

+ 0 - 0
TEAMModelOS/Services/Common/ActivityStudentService.cs


Some files were not shown because too many files changed in this diff